use std::hash::BuildHasher;
use std::hash::Hasher;
pub struct NoHasher(pub u64);
impl Hasher for NoHasher {
fn finish(&self) -> u64 {
self.0
}
fn write(&mut self, _bytes: &[u8]) {
unimplemented!("NoHasher only supports write_u64");
}
fn write_u64(&mut self, i: u64) {
self.0 = i;
}
}
#[derive(Default)]
pub struct NoHasherBuilder;
impl BuildHasher for NoHasherBuilder {
type Hasher = NoHasher;
fn build_hasher(&self) -> Self::Hasher {
NoHasher(0)
}
}
#[cfg(test)]
mod tests {
use std::hash::BuildHasher;
use std::hash::Hasher;
use crate::NoHasher;
use crate::NoHasherBuilder;
#[test]
fn test_no_hasher() {
let mut hasher = NoHasher(0);
hasher.write_u64(42);
assert_eq!(
hasher.finish(),
42,
"NoHasher should return the value passed to write_u64"
);
let builder = NoHasherBuilder;
let hasher = builder.build_hasher();
assert_eq!(
hasher.finish(),
0,
"NoHasherBuilder should create a hasher with initial value 0"
);
}
}