pub const FNV_OFFSET: u64 = 0xcbf29ce484222325;
pub const FNV_PRIME: u64 = 0x100000001b3;
pub fn fnv64(bytes: &[u8]) -> u64 {
let mut h = FNV_OFFSET;
for &b in bytes {
h ^= b as u64;
h = h.wrapping_mul(FNV_PRIME);
}
h
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn vectors() {
assert_eq!(fnv64(b""), 0xcbf29ce484222325);
assert_eq!(fnv64(b"a"), 0xaf63dc4c8601ec8c);
assert_eq!(fnv64(b"foobar"), 0x85944171f73967e8);
}
#[test]
fn wraps_aligns_if_reference() {
let mut buf = [0u8; 4096];
buf[0] = 1;
let h = fnv64(&buf);
let _ = h;
}
}