pub const FNV1A_OFFSET_BASIS: u64 = 0xcbf29ce484222325;
pub const FNV1A_PRIME: u64 = 0x100000001b3;
pub fn fnv1a_hash(data: &[u8]) -> u64 {
let mut hash = FNV1A_OFFSET_BASIS;
for &byte in data {
hash ^= byte as u64;
hash = hash.wrapping_mul(FNV1A_PRIME);
}
hash
}
#[allow(dead_code)]
pub fn fnv1a_hash_str(s: &str) -> u64 {
fnv1a_hash(s.as_bytes())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fnv1a_empty() {
assert_eq!(fnv1a_hash(b""), FNV1A_OFFSET_BASIS);
}
#[test]
fn test_fnv1a_basic() {
let hash = fnv1a_hash(b"a");
assert_ne!(hash, FNV1A_OFFSET_BASIS);
}
#[test]
fn test_fnv1a_field_names() {
let h1 = fnv1a_hash(b"children|map");
let h2 = fnv1a_hash(b"children|map");
assert_eq!(h1, h2);
let h3 = fnv1a_hash(b"sections|map");
assert_ne!(h1, h3);
}
#[test]
fn test_fnv1a_hash_str() {
assert_eq!(fnv1a_hash_str("test"), fnv1a_hash(b"test"));
assert_eq!(fnv1a_hash_str(""), fnv1a_hash(b""));
assert_eq!(fnv1a_hash_str("children|map"), fnv1a_hash(b"children|map"));
}
}