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}