use std::hash::{BuildHasher, Hasher};
const FNV_OFFSET_BASIS: u64 = 2166136261;
const FNV_PRIME: u64 = 16777619;
pub(crate) struct FvnHasher {
hash: u64,
}
impl Default for FvnHasher {
fn default() -> Self {
FvnHasher { hash: 0 }
}
}
impl Hasher for FvnHasher {
fn finish(&self) -> u64 {
self.hash
}
fn write(&mut self, bytes: &[u8]) {
self.hash = FNV_OFFSET_BASIS;
for byte in bytes {
self.hash ^= *byte as u64;
self.hash = self.hash.wrapping_mul(FNV_PRIME);
}
}
}
#[derive(Clone, Debug)]
pub(crate) struct FvnBuildHasher {}
impl Default for FvnBuildHasher {
fn default() -> Self {
FvnBuildHasher {}
}
}
impl BuildHasher for FvnBuildHasher {
type Hasher = FvnHasher;
fn build_hasher(&self) -> Self::Hasher {
FvnHasher { hash: 0 }
}
}