use core::hash::{BuildHasher, Hasher};
#[derive(Clone, Debug)]
pub struct GenericFnv1aHasher<const OFFSET: u64, const PRIME: u64> {
hash: u64,
}
impl<const OFFSET: u64, const PRIME: u64> Hasher for GenericFnv1aHasher<OFFSET, PRIME> {
#[inline]
fn finish(&self) -> u64 {
self.hash
}
#[inline]
fn write(&mut self, bytes: &[u8]) {
for byte in bytes {
self.hash ^= *byte as u64;
self.hash = self.hash.wrapping_mul(PRIME);
}
}
}
impl<const OFFSET: u64, const PRIME: u64> Default for GenericFnv1aHasher<OFFSET, PRIME> {
fn default() -> Self {
Self { hash: OFFSET }
}
}
#[derive(Clone, Debug)]
pub struct GenericFnv1aBuildHasher<const OFFSET: u64, const PRIME: u64> {}
impl<const OFFSET: u64, const PRIME: u64> BuildHasher for GenericFnv1aBuildHasher<OFFSET, PRIME> {
type Hasher = GenericFnv1aHasher<OFFSET, PRIME>;
#[inline]
fn build_hasher(&self) -> Self::Hasher {
GenericFnv1aHasher::default()
}
}
impl<const OFFSET: u64, const PRIME: u64> Default for GenericFnv1aBuildHasher<OFFSET, PRIME> {
fn default() -> Self {
Self {}
}
}
pub type Fnv1aHasher = GenericFnv1aHasher<{ crate::OFFSET }, { crate::PRIME }>;
pub type Fnv1aBuildHasher = GenericFnv1aBuildHasher<{ crate::OFFSET }, { crate::PRIME }>;