crc32c/
hasher.rs

1//! Provide a CRC-32C implementor of [Hasher].
2use std::hash::Hasher;
3
4use crate::crc32c_append;
5
6/// Implementor of [Hasher] for CRC-32C.
7///
8/// Note that CRC-32C produces a 32-bit hash (as [u32]),
9/// but the trait requires that the output value be [u64].
10#[derive(Default)]
11pub struct Crc32cHasher {
12    checksum: u32,
13}
14
15impl Crc32cHasher {
16    /// Create the [Hasher] pre-loaded with a particular checksum.
17    ///
18    /// Use the [Default::default()] constructor for a clean start.
19    pub fn new(initial: u32) -> Self {
20        Self { checksum: initial }
21    }
22}
23
24impl Hasher for Crc32cHasher {
25    fn finish(&self) -> u64 {
26        self.checksum as u64
27    }
28
29    fn write(&mut self, bytes: &[u8]) {
30        self.checksum = crc32c_append(self.checksum, bytes);
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    const TEST_STRING: &[u8] =
39        b"This is a very long string which is used to test the CRC-32-Castagnoli function.";
40    const CHECKSUM: u32 = 0x20_CB_1E_59;
41
42    #[test]
43    fn can_hash() {
44        let mut hasher = Crc32cHasher::default();
45        hasher.write(TEST_STRING);
46        assert_eq!(hasher.finish(), CHECKSUM as u64);
47    }
48}