pub const FINGERPRINT_BYTES: usize = 4;
pub fn fingerprint(value: &[u8]) -> String {
blake3::hash(value).to_hex()[..FINGERPRINT_BYTES * 2].to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_stable_across_calls() {
assert_eq!(fingerprint(b"hunter2"), fingerprint(b"hunter2"));
}
#[test]
fn differs_for_different_values() {
assert_ne!(fingerprint(b"hunter2"), fingerprint(b"hunter3"));
}
#[test]
fn is_truncated_not_full_hash() {
let fp = fingerprint(b"hunter2");
assert_eq!(fp.len(), FINGERPRINT_BYTES * 2);
let full = blake3::hash(b"hunter2").to_hex().to_string();
assert_ne!(fp.len(), full.len());
assert!(full.starts_with(&fp));
}
#[test]
fn is_lowercase_hex() {
let fp = fingerprint(b"\x00\xff\x10\xab");
assert!(
fp.chars()
.all(|c| c.is_ascii_hexdigit() && !c.is_ascii_uppercase())
);
}
}