use std::hash::BuildHasher;
use std::hash::Hasher;
use dupe::Dupe;
use fxhash::FxHasher64;
#[cfg(feature = "pagable_dep")]
use pagable::Pagable;
use crate::hash_value::StarlarkHashValue;
#[derive(Default)]
pub struct StarlarkHasher(
): `FxHasher64` is endian-dependent, this is not right.
FxHasher64,
);
impl StarlarkHasher {
#[inline]
pub fn new() -> StarlarkHasher {
StarlarkHasher::default()
}
#[inline]
pub fn finish_small(&self) -> StarlarkHashValue {
StarlarkHashValue::new_unchecked(self.finish() as u32)
}
}
impl Hasher for StarlarkHasher {
#[inline]
fn finish(&self) -> u64 {
self.0.finish()
}
#[inline]
fn write(&mut self, bytes: &[u8]) {
self.0.write(bytes)
}
#[inline]
fn write_u8(&mut self, i: u8) {
self.0.write_u8(i)
}
#[inline]
fn write_u16(&mut self, i: u16) {
self.0.write_u16(i)
}
#[inline]
fn write_u32(&mut self, i: u32) {
self.0.write_u32(i)
}
#[inline]
fn write_u64(&mut self, i: u64) {
self.0.write_u64(i)
}
#[inline]
fn write_u128(&mut self, i: u128) {
self.0.write_u128(i)
}
#[inline]
fn write_usize(&mut self, i: usize) {
self.0.write_usize(i)
}
}
#[derive(Default, Debug, Clone, Copy, Dupe)]
#[cfg_attr(feature = "pagable_dep", derive(Pagable))]
pub struct StarlarkHasherBuilder;
impl BuildHasher for StarlarkHasherBuilder {
type Hasher = StarlarkHasher;
#[inline]
fn build_hasher(&self) -> StarlarkHasher {
StarlarkHasher::default()
}
}