use rapidhash::fast::RapidHasher;
use std::hash::Hasher;
#[derive(Clone)]
pub struct DeterministicHasher {
seed: u64,
}
impl DeterministicHasher {
pub fn new(seed: u64) -> Self {
Self { seed }
}
#[inline]
pub fn hash_u64(&self, value: u64) -> u64 {
let mut hasher = RapidHasher::new(self.seed);
hasher.write_u64(value);
hasher.finish()
}
pub fn hash(&self, value: u64) -> u64 {
self.hash_u64(value)
}
pub fn seed(&self) -> u64 {
self.seed
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deterministic_hashing() {
let hasher1 = DeterministicHasher::new(42);
let hasher2 = DeterministicHasher::new(42);
let hasher3 = DeterministicHasher::new(43);
let value = 0x123456789abcdef0u64;
assert_eq!(hasher1.hash(value), hasher2.hash(value));
assert_ne!(hasher1.hash(value), hasher3.hash(value));
}
#[test]
fn test_different_values_produce_different_hashes() {
let hasher = DeterministicHasher::new(1);
let hash1 = hasher.hash(100);
let hash2 = hasher.hash(101);
assert_ne!(hash1, hash2);
}
}