use core::hash::Hasher;
const MIX_C1: u64 = 0xff51_afd7_ed55_8ccd;
#[inline(always)]
pub const fn mix64(k: u64) -> u64 {
let r = (k as u128).wrapping_mul(MIX_C1 as u128);
(r ^ (r >> 64)) as u64
}
#[derive(Clone)]
pub struct RapidHasher(rapidhash::fast::RapidHasher<'static>);
impl Default for RapidHasher {
#[inline(always)]
fn default() -> Self {
Self(rapidhash::fast::RapidHasher::new(MIX_C1))
}
}
impl Hasher for RapidHasher {
#[inline(always)]
fn finish(&self) -> u64 {
self.0.finish()
}
#[inline(always)]
fn write(&mut self, bytes: &[u8]) {
self.0.write(bytes);
}
#[inline(always)]
fn write_u64(&mut self, i: u64) {
self.0.write_u64(i);
}
}
pub trait Fingerprint:
Default + Copy + PartialEq + core::ops::BitXorAssign + core::ops::BitXor<Output = Self> + 'static
{
const ZERO: Self;
fn from_hash(hash: u64) -> Self;
}
macro_rules! impl_fingerprint {
($ty:ty) => {
impl Fingerprint for $ty {
const ZERO: Self = 0;
#[inline(always)]
fn from_hash(hash: u64) -> Self {
hash as Self
}
}
};
}
impl_fingerprint!(u8);
impl_fingerprint!(u16);
impl_fingerprint!(u32);