This is an automated email from the ASF dual-hosted git repository. mgrigorov pushed a commit to branch avro-3284-update-to-digest-0.10+ in repository https://gitbox.apache.org/repos/asf/avro.git
commit d29ebeb67ee87534e2c5eee8d66053b295cab24f Author: Martin Tzvetanov Grigorov <[email protected]> AuthorDate: Fri Jan 7 11:26:12 2022 +0200 AVRO-3284 Update Rabin fingerprint implementation to digest to 0.10+ Signed-off-by: Martin Tzvetanov Grigorov <[email protected]> --- lang/rust/Cargo.toml | 6 +++--- lang/rust/src/rabin.rs | 33 ++++++++++++++++++++------------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lang/rust/Cargo.toml b/lang/rust/Cargo.toml index 7709156..2158f41 100644 --- a/lang/rust/Cargo.toml +++ b/lang/rust/Cargo.toml @@ -54,7 +54,7 @@ harness = false byteorder = "1.4.3" bzip2 = { version = "0.4.3", optional = true } crc32fast = { version = "1.2.1", optional = true } -digest = "0.9" +digest = "0.10.1" libflate = "1.1.1" num-bigint = "0.4.2" rand = "0.8.4" @@ -73,8 +73,8 @@ log = "0.4.14" zstd = { version = "0.9.0+zstd.1.5.0" , optional = true } [dev-dependencies] -md-5 = "0.9.1" -sha2 = "0.9.8" +md-5 = "0.10.0" +sha2 = "0.10.0" criterion = "0.3.5" anyhow = "1.0.44" hex-literal = "0.3.3" diff --git a/lang/rust/src/rabin.rs b/lang/rust/src/rabin.rs index aebaacc..d7cb773 100644 --- a/lang/rust/src/rabin.rs +++ b/lang/rust/src/rabin.rs @@ -17,7 +17,10 @@ //! Implementation of the Rabin fingerprint algorithm use byteorder::{ByteOrder, LittleEndian}; -use digest::{consts::U8, generic_array::GenericArray, FixedOutput, Reset, Update}; +use digest::{ + consts::U8, core_api::OutputSizeUser, generic_array::GenericArray, FixedOutput, + FixedOutputReset, HashMarker, Output, Reset, Update, +}; use lazy_static::lazy_static; const EMPTY: i64 = -4513414715797952619; @@ -90,8 +93,8 @@ impl Default for Rabin { } impl Update for Rabin { - fn update(&mut self, input: impl AsRef<[u8]>) { - for b in input.as_ref() { + fn update(&mut self, data: &[u8]) { + for b in data { self.result = (self.result as u64 >> 8) as i64 ^ FPTABLE[((self.result ^ *b as i64) & 0xff) as usize]; } @@ -99,18 +102,9 @@ impl Update for Rabin { } impl FixedOutput for Rabin { - // 8-byte little-endian form of the i64 - // See: https://avro.apache.org/docs/current/spec.html#single_object_encoding - type OutputSize = U8; - fn finalize_into(self, out: &mut GenericArray<u8, Self::OutputSize>) { LittleEndian::write_i64(out, self.result); } - - fn finalize_into_reset(&mut self, out: &mut GenericArray<u8, Self::OutputSize>) { - LittleEndian::write_i64(out, self.result); - self.result = EMPTY; - } } impl Reset for Rabin { @@ -119,7 +113,20 @@ impl Reset for Rabin { } } -digest::impl_write!(Rabin); +impl OutputSizeUser for Rabin { + // 8-byte little-endian form of the i64 + // See: https://avro.apache.org/docs/current/spec.html#single_object_encoding + type OutputSize = U8; +} + +impl HashMarker for Rabin {} + +impl FixedOutputReset for Rabin { + fn finalize_into_reset(&mut self, out: &mut Output<Self>) { + LittleEndian::write_i64(out, self.result); + self.reset(); + } +} #[cfg(test)] mod tests {
