use serde::{Deserialize, Serialize};
use tiny_keccak::{Hasher as _, Keccak};
use crate::Digest;
#[inline]
pub fn keccak256(data: &[u8]) -> Digest {
let mut hasher = Keccak::v256();
hasher.update(data);
let mut output = [0u8; 32];
hasher.finalize(&mut output);
Digest(output)
}
#[inline]
pub fn keccak256_combine<I, T>(items: I) -> Digest
where
I: IntoIterator<Item = T>,
T: AsRef<[u8]>,
{
let mut hasher = Keccak::v256();
for data in items {
hasher.update(data.as_ref());
}
let mut output = [0u8; 32];
hasher.finalize(&mut output);
Digest(output)
}
pub trait Hasher {
type Digest;
fn merge(left: &Self::Digest, right: &Self::Digest) -> Self::Digest;
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct Keccak256Hasher;
impl Hasher for Keccak256Hasher {
type Digest = Digest;
#[inline]
fn merge(left: &Self::Digest, right: &Self::Digest) -> Self::Digest {
keccak256_combine([left.as_ref(), right.as_ref()])
}
}