use io_replica::object::ReplicaHash;
pub fn content_hash(bytes: &[u8]) -> ReplicaHash {
let mut a: u64 = 0xcbf2_9ce4_8422_2325;
let mut b: u64 = 0x9e37_79b9_7f4a_7c15;
for &byte in bytes {
a ^= byte as u64;
a = a.wrapping_mul(0x0000_0100_0000_01b3);
b = b.wrapping_add(byte as u64);
b ^= b << 13;
b = b.wrapping_mul(0xff51_afd7_ed55_8ccd);
}
a ^= bytes.len() as u64;
ReplicaHash::from(format!("{a:016x}{b:016x}"))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn matches_the_shared_digest_shape() {
let h = content_hash(b"Message-ID: <x@y>\r\n\r\nhello world");
assert_eq!(h.0.len(), 32);
assert!(h.0.chars().all(|c| c.is_ascii_hexdigit()));
assert_eq!(content_hash(b"same"), content_hash(b"same"));
assert_ne!(content_hash(b"a"), content_hash(b"b"));
}
}