use core::hash::{BuildHasher, Hasher};
pub struct GenericFvn1Hasher<const OFFSET: u64, const PRIME: u64> {
hash: u64,
}
impl<const OFFSET: u64, const PRIME: u64> Hasher for GenericFvn1Hasher<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 GenericFvn1Hasher<OFFSET, PRIME> {
fn default() -> Self {
Self { hash: OFFSET }
}
}
pub struct GenericFvn1BuildHasher<const OFFSET: u64, const PRIME: u64> {}
impl<const OFFSET: u64, const PRIME: u64> BuildHasher for GenericFvn1BuildHasher<OFFSET, PRIME> {
type Hasher = GenericFvn1Hasher<OFFSET, PRIME>;
fn build_hasher(&self) -> Self::Hasher {
GenericFvn1Hasher::default()
}
}
impl<const OFFSET: u64, const PRIME: u64> Default for GenericFvn1BuildHasher<OFFSET, PRIME> {
fn default() -> Self {
Self {}
}
}
pub type Fvn1Hasher = GenericFvn1Hasher<{ crate::OFFSET }, { crate::PRIME }>;
pub type Fvn1BuildHasher = GenericFvn1BuildHasher<{ crate::OFFSET }, { crate::PRIME }>;
pub type Fvn0Hasher = GenericFvn1Hasher<0, { crate::PRIME }>;
pub type Fvn0BuildHasher = GenericFvn1BuildHasher<0, { crate::PRIME }>;