stdlib_rs/crypto/
fnv.rs

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}