mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 15:23:46 +00:00
move fnv hashing support into librustc_data_structures
This commit is contained in:
parent
4f5267dba3
commit
714f2a8921
@ -13,14 +13,10 @@
|
||||
#![allow(non_snake_case)]
|
||||
|
||||
use middle::def_id::DefId;
|
||||
use std::collections::hash_state::DefaultState;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::default::Default;
|
||||
use std::hash::{Hasher, Hash};
|
||||
use syntax::ast;
|
||||
|
||||
pub type FnvHashMap<K, V> = HashMap<K, V, DefaultState<FnvHasher>>;
|
||||
pub type FnvHashSet<V> = HashSet<V, DefaultState<FnvHasher>>;
|
||||
pub use rustc_data_structures::fnv::FnvHashMap;
|
||||
pub use rustc_data_structures::fnv::FnvHashSet;
|
||||
|
||||
pub type NodeMap<T> = FnvHashMap<ast::NodeId, T>;
|
||||
pub type DefIdMap<T> = FnvHashMap<DefId, T>;
|
||||
@ -28,39 +24,8 @@ pub type DefIdMap<T> = FnvHashMap<DefId, T>;
|
||||
pub type NodeSet = FnvHashSet<ast::NodeId>;
|
||||
pub type DefIdSet = FnvHashSet<DefId>;
|
||||
|
||||
pub fn FnvHashMap<K: Hash + Eq, V>() -> FnvHashMap<K, V> {
|
||||
Default::default()
|
||||
}
|
||||
pub fn FnvHashSet<V: Hash + Eq>() -> FnvHashSet<V> {
|
||||
Default::default()
|
||||
}
|
||||
|
||||
pub fn NodeMap<T>() -> NodeMap<T> { FnvHashMap() }
|
||||
pub fn DefIdMap<T>() -> DefIdMap<T> { FnvHashMap() }
|
||||
pub fn NodeSet() -> NodeSet { FnvHashSet() }
|
||||
pub fn DefIdSet() -> DefIdSet { FnvHashSet() }
|
||||
|
||||
/// A speedy hash algorithm for node ids and def ids. The hashmap in
|
||||
/// libcollections by default uses SipHash which isn't quite as speedy as we
|
||||
/// want. In the compiler we're not really worried about DOS attempts, so we
|
||||
/// just default to a non-cryptographic hash.
|
||||
///
|
||||
/// This uses FNV hashing, as described here:
|
||||
/// http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function
|
||||
pub struct FnvHasher(u64);
|
||||
|
||||
impl Default for FnvHasher {
|
||||
fn default() -> FnvHasher { FnvHasher(0xcbf29ce484222325) }
|
||||
}
|
||||
|
||||
impl Hasher for FnvHasher {
|
||||
fn write(&mut self, bytes: &[u8]) {
|
||||
let FnvHasher(mut hash) = *self;
|
||||
for byte in bytes {
|
||||
hash = hash ^ (*byte as u64);
|
||||
hash = hash.wrapping_mul(0x100000001b3);
|
||||
}
|
||||
*self = FnvHasher(hash);
|
||||
}
|
||||
fn finish(&self) -> u64 { self.0 }
|
||||
}
|
||||
|
52
src/librustc_data_structures/fnv.rs
Normal file
52
src/librustc_data_structures/fnv.rs
Normal file
@ -0,0 +1,52 @@
|
||||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::collections::hash_state::DefaultState;
|
||||
use std::default::Default;
|
||||
use std::hash::{Hasher, Hash};
|
||||
|
||||
pub type FnvHashMap<K, V> = HashMap<K, V, DefaultState<FnvHasher>>;
|
||||
pub type FnvHashSet<V> = HashSet<V, DefaultState<FnvHasher>>;
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn FnvHashMap<K: Hash + Eq, V>() -> FnvHashMap<K, V> {
|
||||
Default::default()
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn FnvHashSet<V: Hash + Eq>() -> FnvHashSet<V> {
|
||||
Default::default()
|
||||
}
|
||||
|
||||
/// A speedy hash algorithm for node ids and def ids. The hashmap in
|
||||
/// libcollections by default uses SipHash which isn't quite as speedy as we
|
||||
/// want. In the compiler we're not really worried about DOS attempts, so we
|
||||
/// just default to a non-cryptographic hash.
|
||||
///
|
||||
/// This uses FNV hashing, as described here:
|
||||
/// http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function
|
||||
pub struct FnvHasher(u64);
|
||||
|
||||
impl Default for FnvHasher {
|
||||
fn default() -> FnvHasher { FnvHasher(0xcbf29ce484222325) }
|
||||
}
|
||||
|
||||
impl Hasher for FnvHasher {
|
||||
fn write(&mut self, bytes: &[u8]) {
|
||||
let FnvHasher(mut hash) = *self;
|
||||
for byte in bytes {
|
||||
hash = hash ^ (*byte as u64);
|
||||
hash = hash.wrapping_mul(0x100000001b3);
|
||||
}
|
||||
*self = FnvHasher(hash);
|
||||
}
|
||||
fn finish(&self) -> u64 { self.0 }
|
||||
}
|
@ -28,6 +28,8 @@
|
||||
html_root_url = "https://doc.rust-lang.org/nightly/")]
|
||||
|
||||
#![feature(rustc_private, staged_api)]
|
||||
#![feature(hashmap_hasher)]
|
||||
|
||||
#![cfg_attr(test, feature(test))]
|
||||
|
||||
#[macro_use] extern crate log;
|
||||
@ -39,6 +41,7 @@ pub mod ivar;
|
||||
pub mod snapshot_vec;
|
||||
pub mod transitive_relation;
|
||||
pub mod unify;
|
||||
pub mod fnv;
|
||||
|
||||
// See comments in src/librustc/lib.rs
|
||||
#[doc(hidden)]
|
||||
|
Loading…
Reference in New Issue
Block a user