Skip to content

Commit

Permalink
feat: poseidon_hash_may takes an iterator
Browse files Browse the repository at this point in the history
  • Loading branch information
tdelabro committed Jun 17, 2024
1 parent 33581e3 commit 9b6ffb2
Showing 1 changed file with 19 additions and 11 deletions.
30 changes: 19 additions & 11 deletions starknet-crypto/src/poseidon_hash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,21 +72,29 @@ pub fn poseidon_hash_single(x: Felt) -> Felt {
/// Computes the Starknet Poseidon hash of an arbitrary number of [Felt]s.
///
/// Using this function is the same as using [PoseidonHasher].
pub fn poseidon_hash_many(msgs: &[Felt]) -> Felt {
pub fn poseidon_hash_many<'a, I: IntoIterator<Item = &'a Felt>>(msgs: I) -> Felt {
let mut state = [Felt::ZERO, Felt::ZERO, Felt::ZERO];
let mut iter = msgs.chunks_exact(2);
let mut iter = msgs.into_iter();

loop {
match iter.next() {
Some(v) => state[0] += *v,
None => {
state[0] += Felt::ONE;
break;
}
}

match iter.next() {
Some(v) => state[1] += *v,
None => {
state[1] += Felt::ONE;
break;
}
}

for msg in iter.by_ref() {
state[0] += msg[0];
state[1] += msg[1];
poseidon_permute_comp(&mut state);
}
let r = iter.remainder();
if r.len() == 1 {
state[0] += r[0];
}
state[r.len()] += Felt::ONE;
poseidon_permute_comp(&mut state);

state[0]
}
Expand Down

0 comments on commit 9b6ffb2

Please sign in to comment.