murmurhash3/
hasher.rs

1use std::hash::{BuildHasher, Hasher};
2
3use crate::mmh3_32::murmurhash3_x86_32;
4
5pub struct Murmur3Hasher {
6    seed: u32,
7    bytes: Vec<u8>,
8}
9
10#[derive(Clone, Copy, Default)]
11pub struct Murmur3HashState {
12    seed: u32,
13}
14
15impl Murmur3HashState {
16    pub fn with_seed(seed: u32) -> Murmur3HashState {
17        Murmur3HashState { seed }
18    }
19}
20
21impl Hasher for Murmur3Hasher {
22    fn finish(&self) -> u64 {
23        murmurhash3_x86_32(&self.bytes, self.seed) as u64
24    }
25
26    fn write(&mut self, bytes: &[u8]) {
27        let mut copy = bytes.to_vec();
28        self.bytes.append(&mut copy);
29    }
30}
31
32impl BuildHasher for Murmur3HashState {
33    type Hasher = Murmur3Hasher;
34
35    fn build_hasher(&self) -> Self::Hasher {
36        Murmur3Hasher {
37            seed: self.seed,
38            bytes: vec![],
39        }
40    }
41}
42
43#[cfg(test)]
44mod test {
45    use super::Murmur3HashState;
46    use std::collections::hash_map::HashMap;
47
48    #[test]
49    fn use_in_hashmap() {
50        let mut hashmap = HashMap::with_capacity_and_hasher(0, Murmur3HashState::default());
51        hashmap.insert("one", 1);
52        hashmap.insert("two", 2);
53
54        assert_eq!(hashmap.len(), 2);
55
56        assert_eq!(*hashmap.get("one").unwrap(), 1);
57        assert_eq!(*hashmap.get("two").unwrap(), 2);
58    }
59}