1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
mod murmurhash2;
mod murmurhash3;

pub use self::murmurhash2::murmurhash2;
pub use self::murmurhash3::murmurhash3;

#[cfg(test)]
mod test {

    use super::{murmurhash2, murmurhash3};
    use std::collections::HashSet;

    #[test]
    fn test_murmur2() {
        let s1 = "abcdef";
        let s2 = "abcdeg";
        for i in 0..5 {
            assert_eq!(
                murmurhash2(&s1[i..5].as_bytes()),
                murmurhash2(&s2[i..5].as_bytes())
            );
        }
    }

    #[test]
    fn test_murmur3() {
        assert_eq!(murmurhash3(b""), 36_859_204);
        assert_eq!(murmurhash3(b"a"), 3_144_985_375);
        assert_eq!(murmurhash3(b"ab"), 3_262_304_301);
        assert_eq!(murmurhash3(b"abc"), 476_091_040);
        assert_eq!(murmurhash3(b"abcd"), 412_992_581);
        assert_eq!(murmurhash3(b"abcde"), 2_747_833_956);
        assert_eq!(murmurhash3(b"abcdefghijklmnop"), 2_078_305_053);
    }

    #[test]
    fn test_murmur_against_reference_impl() {
        assert_eq!(murmurhash2("".as_bytes()), 3_632_506_080);
        assert_eq!(murmurhash2("a".as_bytes()), 455_683_869);
        assert_eq!(murmurhash2("ab".as_bytes()), 2_448_092_234);
        assert_eq!(murmurhash2("abc".as_bytes()), 2_066_295_634);
        assert_eq!(murmurhash2("abcd".as_bytes()), 2_588_571_162);
        assert_eq!(murmurhash2("abcde".as_bytes()), 29_886_969_42);
        assert_eq!(murmurhash2("abcdefghijklmnop".as_bytes()), 2_350_868_870);
    }

    #[test]
    fn test_murmur_collisions() {
        let mut set: HashSet<u32> = HashSet::default();
        for i in 0..10_000 {
            let s = format!("hash{}", i);
            let hash = murmurhash2(s.as_bytes());
            set.insert(hash);
        }
        assert_eq!(set.len(), 10_000);
    }
}