use hyperlog_simd::hll::HyperLogLog;
use nanorand::Rng;
fn main() {
let mut rng = nanorand::tls_rng();
let mut hll1 = HyperLogLog::new();
let mut hll2 = HyperLogLog::new();
let visits = rng.generate_range(1..100);
for user_id in 1..50_000 {
for _ in 0..visits {
hll1.add(&format!("user-{}", user_id));
}
}
let visits = rng.generate_range(1..100);
for user_id in 50_000..100_000 {
for _ in 0..visits {
hll2.add(&format!("user-{}", user_id));
}
}
hll1.merge(&hll2);
println!("Total visits recorded: {}", 100_000 * 50);
println!("Estimated unique users after merging: {}", hll1.estimate());
#[cfg(feature = "serde_support")]
{
use std::{
fs::File,
io::{Read, Write},
};
let encoded: String = serde_json::to_string(&hll1).unwrap();
let mut file = File::create("hyperloglog.json").unwrap();
file.write_all(encoded.as_bytes()).unwrap();
file.flush().unwrap();
let mut file = File::open("hyperloglog.json").unwrap();
let mut encoded = String::new();
file.read_to_string(&mut encoded).unwrap();
let hll3: HyperLogLog = serde_json::from_slice(encoded.as_bytes()).unwrap();
println!(
"Estimated unique users after deserializing: {}",
hll3.estimate()
);
}
}