From f1ecd26c8b52e112712b0039ee087095f559287b Mon Sep 17 00:00:00 2001 From: lizhanhui Date: Sat, 18 Nov 2023 20:50:33 +0800 Subject: [PATCH] fix #49 consider effect refin with arbitary seed/initial value Signed-off-by: lizhanhui --- Cargo.toml | 1 + src/hasher.rs | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 36e49aa..66c29a1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ build = "build.rs" [dev-dependencies] rand = { version ="0.8", features=["alloc", "getrandom"] } criterion = "0.4" +crc = "3.0.1" [build-dependencies] rustc_version = "0.4" diff --git a/src/hasher.rs b/src/hasher.rs index ab11777..edc2c5a 100644 --- a/src/hasher.rs +++ b/src/hasher.rs @@ -13,11 +13,13 @@ pub struct Crc32cHasher { } impl Crc32cHasher { - /// Create the [Hasher] pre-loaded with a particular checksum. + /// Create the [Hasher] pre-loaded with an arbitrary seed value. /// /// Use the [Default::default()] constructor for a clean start. pub fn new(initial: u32) -> Self { - Self { checksum: initial } + Self { + checksum: !initial.reverse_bits(), + } } } @@ -45,4 +47,20 @@ mod tests { hasher.write(TEST_STRING); assert_eq!(hasher.finish(), CHECKSUM as u64); } + + #[test] + fn test_with_initial_value() { + let seed = 123u32; + let buffer = b"123456789"; + let mut hasher = Crc32cHasher::new(seed); + hasher.write(buffer); + let crc1 = hasher.finish() as u32; + + let castagnoli = crc::Crc::::new(&crc::CRC_32_ISCSI); + let mut digest = castagnoli.digest_with_initial(seed); + digest.update(buffer); + let crc2 = digest.finalize(); + + assert_eq!(crc1, crc2); + } }