From 841c4c52e4225bfe7a7576b7ae857eaaa0ce7595 Mon Sep 17 00:00:00 2001 From: Hugo Demeyere Date: Thu, 9 Jan 2025 23:01:51 +0100 Subject: [PATCH] feat(corelib): ByteArray impl Hash trait --- corelib/src/hash.cairo | 15 +++++++++++++++ corelib/src/test/hash_test.cairo | 16 ++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/corelib/src/hash.cairo b/corelib/src/hash.cairo index 0eb164dc231..d2dfc59f414 100644 --- a/corelib/src/hash.cairo +++ b/corelib/src/hash.cairo @@ -229,3 +229,18 @@ impl TupleNextHash< state.update_with(head).update_with(rest) } } + +impl ByteArrayHash, +Drop> of Hash { + fn update_state(mut state: S, value: ByteArray) -> S { + state = state.update(value.data.len().into()); + + for word_index in 0..value.data.len() { + let word_in_data = (*value.data.at(word_index)).into(); + state = state.update(word_in_data); + }; + + state + .update(value.pending_word_len.into()) + .update(value.pending_word) + } +} \ No newline at end of file diff --git a/corelib/src/test/hash_test.cairo b/corelib/src/test/hash_test.cairo index 17bf43e13b3..aedf0fba12e 100644 --- a/corelib/src/test/hash_test.cairo +++ b/corelib/src/test/hash_test.cairo @@ -85,3 +85,19 @@ fn test_user_defined_hash() { 'Bad hash of StructForHash', ); } + +#[test] +fn test_byte_array_hash() { + let byte_array: ByteArray = "This is a sentence that is longer than 31 characters."; + + let word_1 = 'This is a sentence that is long'; + let data_length = 1; + let pending_word = 'er than 31 characters.'; + let pending_word_len = 22; + + assert_eq( + @PoseidonTrait::new().update_with(byte_array).finalize(), + @PoseidonTrait::new().update(data_length).update(word_1).update(pending_word_len).update(pending_word).finalize(), + 'Bad hash for ByteArray' + ); +}