#![cfg_attr(not(feature = "std"), no_std)]
use core::{
hash::{BuildHasher, Hasher},
mem,
};
pub mod internal;
pub struct FHasher {
state: u64,
}
impl Default for FHasher {
#[inline(always)]
fn default() -> Self {
Self { state: 0 }
}
}
impl From<u64> for FHasher {
#[inline(always)]
fn from(state: u64) -> Self {
Self { state }
}
}
impl Hasher for FHasher {
#[inline(always)]
fn finish(&self) -> u64 {
internal::finish(self.state)
}
#[inline(always)]
fn write(&mut self, bytes: &[u8]) {
self.state = internal::mix_with_bytes(self.state, bytes);
}
#[inline(always)]
fn write_u8(&mut self, i: u8) {
self.write_u64(i as u64);
}
#[inline(always)]
fn write_u16(&mut self, i: u16) {
self.write_u64(i as u64);
}
#[inline(always)]
fn write_u32(&mut self, i: u32) {
self.write_u64(i as u64);
}
#[inline(always)]
fn write_u64(&mut self, i: u64) {
self.state = internal::mix2(self.state, i as u64);
}
#[inline(always)]
fn write_u128(&mut self, i: u128) {
self.state = internal::mix3(self.state, i as u64, (i >> 64) as u64);
}
#[inline(always)]
#[cfg(any(
target_pointer_width = "16",
target_pointer_width = "32",
target_pointer_width = "64",
))]
fn write_usize(&mut self, i: usize) {
self.write_u64(i as u64);
}
#[inline(always)]
#[cfg(target_pointer_width = "128")]
fn write_usize(&mut self, i: usize) {
self.write_u128(i as u128);
}
}
pub struct RandomState {
state: u64,
}
impl RandomState {
#[inline(always)]
pub const fn with_seed(seed: u64) -> Self {
Self { state: seed }
}
}
#[cfg(feature = "std")]
impl Default for RandomState {
#[inline]
fn default() -> Self {
let (l, r) = unsafe { mem::transmute(std::time::Instant::now()) }; Self {
state: internal::finish(internal::mix2(l, r)),
}
}
}
impl From<u64> for RandomState {
#[inline(always)]
fn from(state: u64) -> Self {
Self { state }
}
}
impl BuildHasher for RandomState {
type Hasher = FHasher;
#[inline(always)]
fn build_hasher(&self) -> FHasher {
FHasher { state: self.state }
}
}