use bloomcraft::hash::{BloomHasher, StdHasher, WyHasher, XxHasher};
fn main() {
let std_hash = StdHasher::new();
let wy_hash = WyHasher::new();
let xx_hash = XxHasher::new();
assert_eq!(std_hash.name(), "StdHasher");
assert_eq!(wy_hash.name(), "WyHash");
assert_eq!(xx_hash.name(), "XXHash3");
let _h = bloomcraft::hash::recommended_hasher();
let h = wy_hash.hash_bytes(b"hello world");
println!("hash_bytes: 0x{h:016x}");
assert_eq!(
wy_hash.hash_bytes(b"hello world"),
wy_hash.hash_bytes(b"hello world")
);
let (h1, h2) = wy_hash.hash_item(&"string key");
assert_ne!(h1, h2);
println!("hash_item (string): h1 = 0x{h1:016x}, h2 = 0x{h2:016x}");
let (_h1, _h2) = wy_hash.hash_item(&42u64);
let (_h1, _h2) = wy_hash.hash_item(&[1, 2, 3, 4, 5]);
let h_a = WyHasher::with_seed(1).hash_bytes(b"test");
let h_b = WyHasher::with_seed(2).hash_bytes(b"test");
assert_ne!(h_a, h_b);
println!("seed(1) = 0x{h_a:016x}");
println!("seed(2) = 0x{h_b:016x}");
let (p1, p2) = wy_hash.hash_bytes_pair(b"data");
assert_ne!(p1, p2);
println!("pair: p1 = 0x{p1:016x}, p2 = 0x{p2:016x}");
let (t1, t2, t3) = wy_hash.hash_bytes_triple(b"data");
assert_ne!(t1, t2);
assert_ne!(t2, t3);
assert_ne!(t1, t3);
let a = WyHasher::with_seed(0);
let b = WyHasher::with_seed(0);
let c = WyHasher::with_seed(42);
assert_eq!(a.instance_token(), b.instance_token());
assert_ne!(a.instance_token(), c.instance_token());
println!("instance_token(seed=0): 0x{:016x}", a.instance_token());
println!("instance_token(seed=42): 0x{:016x}", c.instance_token());
use std::collections::HashMap;
let mut map: HashMap<String, i32, _> =
HashMap::with_hasher(bloomcraft::hash::WyHasherBuilder::new());
*map.entry("key".to_string()).or_insert(0) += 1;
println!("HashMap with WyHasher: key -> {}", map["key"]);
println!("\nAll checks passed.");
}