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
use crate::Hasher as _;

const BASIS: u32 = 0x811c9dc5;
const PRIME: u32 = 0x1000193;

/// 32-bit Fowler-Noll-Vo hasher
pub struct Hasher {
    state: u32,
}

impl Default for Hasher {
    fn default() -> Self {
        Hasher { state: BASIS }
    }
}

impl crate::Hasher for Hasher {
    #[inline]
    fn finish32(&self) -> u32 {
        self.state
    }
}

impl core::hash::Hasher for Hasher {
    #[inline]
    fn write(&mut self, bytes: &[u8]) {
        for byte in bytes {
            self.state ^= u32::from(*byte);
            self.state = self.state.wrapping_mul(PRIME);
        }
    }

    #[inline]
    fn finish(&self) -> u64 {
        self.finish32().into()
    }
}