use std::collections::HashMap;
use std::hash::{BuildHasherDefault, Hasher};
#[derive(Clone, Default)]
pub(crate) struct U64Hasher {
value: u64,
}
impl Hasher for U64Hasher {
fn finish(&self) -> u64 {
self.value
}
fn write(&mut self, _bytes: &[u8]) {
unimplemented!()
}
fn write_u64(&mut self, i: u64) {
const PRIME: u64 = (1 << 63) - 25;
self.value = i.wrapping_mul(PRIME);
}
}
pub(crate) type U64HahserBuilder = BuildHasherDefault<U64Hasher>;
pub(crate) type U64HashMap<K, V> = HashMap<K, V, U64HahserBuilder>;
#[cfg(test)]
mod test {
use super::*;
#[test]
fn hash_map_u64() {
use rand::prelude::*;
use rand::rng;
let mut nums = vec![0u64; 1 << 16];
rng().fill(&mut nums[..]);
let mut hash_map =
U64HashMap::<u64, u8>::with_capacity_and_hasher(1 << 16, U64HahserBuilder::new());
for n in nums {
let value = rng().random();
hash_map.insert(n, value);
assert!(matches!(hash_map.get(&n), Some(v) if *v == value));
}
}
}