From 69b01f074121b839f517674475d4c2188dbfdc84 Mon Sep 17 00:00:00 2001 From: Nico Wagner Date: Sat, 17 Jun 2023 14:36:13 +0200 Subject: [PATCH 1/2] Add `sha256` for ByteRecord --- pica-record/CHANGELOG.md | 1 + pica-record/Cargo.toml | 1 + pica-record/foo.txt | 1 + pica-record/src/record.rs | 42 ++++++++++++++++++++++++++++++++++----- 4 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 pica-record/foo.txt diff --git a/pica-record/CHANGELOG.md b/pica-record/CHANGELOG.md index ad00332cb..3a83cbdcb 100644 --- a/pica-record/CHANGELOG.md +++ b/pica-record/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added * #625 Implement `Hash` for `ByteRecord` +* #626 Implement `sha256` for `ByteRecord` ## v0.1.0 diff --git a/pica-record/Cargo.toml b/pica-record/Cargo.toml index cccf215c7..c154145a3 100644 --- a/pica-record/Cargo.toml +++ b/pica-record/Cargo.toml @@ -10,6 +10,7 @@ edition = "2021" bstr = "1.5" flate2 = "1.0" nom = "7.1" +sha2 = "0.10" thiserror = "1.0" [dev-dependencies] diff --git a/pica-record/foo.txt b/pica-record/foo.txt new file mode 100644 index 000000000..2a995f67c --- /dev/null +++ b/pica-record/foo.txt @@ -0,0 +1 @@ +003@ 0123456789X diff --git a/pica-record/src/record.rs b/pica-record/src/record.rs index 71d486424..c31b8e278 100644 --- a/pica-record/src/record.rs +++ b/pica-record/src/record.rs @@ -11,6 +11,7 @@ use nom::combinator::all_consuming; use nom::multi::many1; use nom::sequence::terminated; use nom::Finish; +use sha2::{Digest, Sha256}; use crate::field::{parse_field, RawField}; use crate::parser::{ParseResult, LF}; @@ -325,6 +326,23 @@ impl<'a> ByteRecord<'a> { self.record.retain(f); self.raw_data = None; } + + pub fn sha256(&self) -> Vec { + let mut hasher = Sha256::new(); + + match self.raw_data { + Some(data) => hasher.update(data), + None => { + let mut writer = Cursor::new(Vec::::new()); + let _ = self.write_to(&mut writer); + let data = writer.into_inner(); + hasher.update(data); + } + }; + + let result = hasher.finalize(); + result.to_vec() + } } impl<'a> Deref for ByteRecord<'a> { @@ -354,12 +372,8 @@ impl<'a> From> for ByteRecord<'a> { impl<'a> Hash for ByteRecord<'a> { fn hash(&self, state: &mut H) { match self.raw_data { - Some(data) => { - eprintln!("hash1"); - data.hash(state) - } + Some(data) => data.hash(state), None => { - eprintln!("hash2"); let mut writer = Cursor::new(Vec::::new()); let _ = self.write_to(&mut writer); let data = writer.into_inner(); @@ -454,6 +468,24 @@ mod tests { Ok(()) } + #[test] + fn test_byte_record_sha256() -> anyhow::Result<()> { + let record = + ByteRecord::from_bytes(b"003@ \x1f0123456789X\x1e\n")?; + + assert_eq!(record.sha256(), b"K\x1f8\xbe\xf4m\xa5\xd0\x8b@{u7\x8bi\x96\x96\xc5\x91\xf6 \xddM\xd3\x8dy\xad[\x96;=\xb6"); + + let record = ByteRecord::from(RecordRef::new(vec![( + "003@", + None, + vec![('0', "123456789X")], + )])); + + assert_eq!(record.sha256(), b"K\x1f8\xbe\xf4m\xa5\xd0\x8b@{u7\x8bi\x96\x96\xc5\x91\xf6 \xddM\xd3\x8dy\xad[\x96;=\xb6"); + + Ok(()) + } + #[test] fn test_string_record() -> anyhow::Result<()> { let record = From ee63b15f64e97eed5f0c07b66d4a374522fb8beb Mon Sep 17 00:00:00 2001 From: Nico Wagner Date: Mon, 19 Jun 2023 09:41:21 +0200 Subject: [PATCH 2/2] Cleanup / docs --- pica-record/src/record.rs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/pica-record/src/record.rs b/pica-record/src/record.rs index c31b8e278..ce2d14184 100644 --- a/pica-record/src/record.rs +++ b/pica-record/src/record.rs @@ -327,18 +327,14 @@ impl<'a> ByteRecord<'a> { self.raw_data = None; } + /// Returns the SHA-256 hash of the record. pub fn sha256(&self) -> Vec { + let mut writer = Cursor::new(Vec::::new()); let mut hasher = Sha256::new(); - match self.raw_data { - Some(data) => hasher.update(data), - None => { - let mut writer = Cursor::new(Vec::::new()); - let _ = self.write_to(&mut writer); - let data = writer.into_inner(); - hasher.update(data); - } - }; + let _ = self.write_to(&mut writer); + let data = writer.into_inner(); + hasher.update(data); let result = hasher.finalize(); result.to_vec()