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