use alloc::vec::Vec;
pub fn poseidon_felt252(data: &[u8]) -> [u8; 32] {
use starknet_crypto::{poseidon_hash_many, Felt};
if data.is_empty() {
return felt_to_bytes(&poseidon_hash_many(&[]));
}
let felts: Vec<Felt> = data
.chunks(31)
.map(Felt::from_bytes_be_slice)
.collect();
felt_to_bytes(&poseidon_hash_many(&felts))
}
fn felt_to_bytes(f: &starknet_crypto::Felt) -> [u8; 32] {
f.to_bytes_be()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn poseidon_determinism() {
let h1 = poseidon_felt252(b"test");
let h2 = poseidon_felt252(b"test");
assert_eq!(h1, h2);
}
#[test]
fn poseidon_empty_input() {
let h = poseidon_felt252(b"");
assert_eq!(h.len(), 32);
assert_eq!(h, poseidon_felt252(b""));
}
#[test]
fn poseidon_different_inputs() {
let h1 = poseidon_felt252(b"hello");
let h2 = poseidon_felt252(b"world");
assert_ne!(h1, h2);
}
#[test]
fn poseidon_single_chunk() {
let data = [0xabu8; 31];
let h = poseidon_felt252(&data);
assert_eq!(h.len(), 32);
}
#[test]
fn poseidon_multi_chunk() {
let data = [0xcd; 63];
let h = poseidon_felt252(&data);
assert_eq!(h.len(), 32);
}
#[test]
fn poseidon_large_input() {
let data = vec![0x42; 1024];
let h = poseidon_felt252(&data);
assert_eq!(h.len(), 32);
}
}