    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

    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 ::Hasher for Hasher {
        #[inline]
        fn finish(&self) -> u32 {
            self.state
        }

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