use xxhash_rust::xxh3::xxh3_64;
pub fn checksum(data: &[u8]) -> [u8; 8] {
xxh3_64(data).to_be_bytes()
}
pub fn verify_checksum(data: &[u8], expected: &[u8; 8]) -> bool {
&checksum(data) == expected
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn checksum_is_deterministic() {
let data = b"cachekit checksum determinism vector";
assert_eq!(checksum(data), checksum(data));
}
#[test]
fn checksum_handles_empty_input() {
assert_eq!(
checksum(b""),
[0x2D, 0x06, 0x80, 0x05, 0x38, 0xD3, 0x94, 0xC2]
);
}
#[test]
fn verify_checksum_accepts_matching() {
let data = b"payload bytes";
assert!(verify_checksum(data, &checksum(data)));
}
#[test]
fn verify_checksum_rejects_single_bit_flip() {
let data = b"payload bytes";
let mut corrupted = checksum(data);
corrupted[0] ^= 0x01;
assert!(!verify_checksum(data, &corrupted));
}
#[test]
fn verify_checksum_rejects_wrong_data() {
let expected = checksum(b"original");
assert!(!verify_checksum(b"tampered", &expected));
}
#[test]
fn checksum_known_answer_locks_endianness() {
assert_eq!(
checksum(b"cachekit-kat"),
[209u8, 35, 204, 155, 190, 157, 164, 177]
);
}
}