1use std::hash::Hasher;
2
3pub struct Fnv32Hasher(u32);
4pub struct Fnv64Hasher(u64);
5
6impl Fnv32Hasher {
7 pub fn seed(seed: u32) -> Fnv32Hasher {
8 Fnv32Hasher(seed)
9 }
10}
11
12impl Default for Fnv32Hasher {
13 fn default() -> Fnv32Hasher {
14 Fnv32Hasher(2166136261)
15 }
16}
17
18impl Hasher for Fnv32Hasher {
19 fn write(&mut self, bytes: &[u8]) {
20 for byte in bytes.iter() {
21 self.0 = self.0 ^ (*byte as u32);
22 self.0 = self.0.wrapping_mul(16777619);
23 }
24 }
25 fn finish(&self) -> u64 {
26 self.0.into()
27 }
28}
29
30impl Fnv64Hasher {
31 pub fn seed(seed: u64) -> Fnv64Hasher {
32 Fnv64Hasher(seed)
33 }
34}
35
36impl Default for Fnv64Hasher {
37 fn default() -> Fnv64Hasher {
38 Fnv64Hasher(14695981039346656037)
39 }
40}
41
42impl Hasher for Fnv64Hasher {
43 fn write(&mut self, bytes: &[u8]) {
44 for byte in bytes.iter() {
45 self.0 = self.0 ^ (*byte as u64);
46 self.0 = self.0.wrapping_mul(1099511628211);
47 }
48 }
49 fn finish(&self) -> u64 {
50 self.0
51 }
52}
53
54#[cfg(test)]
55mod test {
56 use super::*;
57
58 fn fnv_64(bytes: &[u8]) -> u64 {
59 let mut hasher = Fnv64Hasher::default();
60 hasher.write(bytes);
61 hasher.finish()
62 }
63
64 fn fnv_32(bytes: &[u8]) -> u64 {
65 let mut hasher = Fnv32Hasher::default();
66 hasher.write(bytes);
67 hasher.finish()
68 }
69
70 #[test]
71 fn empty() {
72 assert_eq!(fnv_64(b""), 14695981039346656037);
73 assert_eq!(fnv_32(b""), 2166136261);
74 }
75}