commit be2d71247186cadadca4c06b34e6ed4db6dc8772 Author: Simon Sapin Date: Mon Apr 6 20:43:00 2015 +0200 Import from https://github.com/servo/rust-selectors/blob/1fda09bf0c59acfcb697f71b38dad22108b3d27a/src/fnv.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a9d37c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..269f680 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "fnv" +version = "1.0.0" +authors = ["Alex Crichton "] +description = "Fowler–Noll–Vo hash function" +license = "Apache-2 / MIT" +readme = "README.md" + +[lib] +name = "fnv" +path = "lib.rs" +doctest = false diff --git a/README.md b/README.md new file mode 100644 index 0000000..d06b330 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +rust-fnv +======== + +Fowler–Noll–Vo hash function diff --git a/lib.rs b/lib.rs new file mode 100644 index 0000000..680cdeb --- /dev/null +++ b/lib.rs @@ -0,0 +1,33 @@ +//! This file stolen wholesale from https://github.com/rust-lang/rust/blob/master/src/librustc/util/nodemap.rs + +use std::default::Default; +use std::hash::Hasher; + +/// 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 +#[allow(missing_copy_implementations)] +pub struct FnvHasher(u64); + +impl Default for FnvHasher { + #[inline] + fn default() -> FnvHasher { FnvHasher(0xcbf29ce484222325) } +} + +impl Hasher for FnvHasher { + #[inline] + fn finish(&self) -> u64 { self.0 } + #[inline] + fn write(&mut self, bytes: &[u8]) { + let FnvHasher(mut hash) = *self; + for byte in bytes.iter() { + hash = hash ^ (*byte as u64); + hash = hash.wrapping_mul(0x100000001b3); + } + *self = FnvHasher(hash); + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..a93251b --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,3 @@ +#[test] +fn it_works() { +}