pub struct Hasher {
state: u64,
}
impl Hasher {
pub fn new() -> Self {
Self { state: 0 }
}
pub fn update_u64(&mut self, val: u64) {
self.state = self.combine(self.state, seahash::hash(&val.to_le_bytes()));
}
pub fn update_bytes(&mut self, bytes: &[u8]) {
self.state = self.combine(self.state, seahash::hash(bytes));
}
pub fn finish(&self) -> u64 {
self.state
}
fn combine(&self, a: u64, b: u64) -> u64 {
a.wrapping_add(b)
.wrapping_add(0x9E3779B97F4A7C15)
.rotate_left(7)
}
}
pub fn combine_hashes(a: u64, b: u64) -> u64 {
let mut h = Hasher { state: a };
h.update_u64(b);
h.finish()
}
pub fn hash_u64(val: u64) -> u64 {
seahash::hash(&val.to_le_bytes())
}
pub fn hash_f32(val: f32) -> u64 {
hash_u64(val.to_bits() as u64)
}
pub fn hash_str(val: &str) -> u64 {
seahash::hash(val.as_bytes())
}