1use std::hash::Hasher;
3
4use crate::crc32c_append;
5
6#[derive(Default)]
11pub struct Crc32cHasher {
12 checksum: u32,
13}
14
15impl Crc32cHasher {
16 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}