use rand::{RngExt, rng};
use snowid::SnowID;
use std::collections::HashSet;
use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;
fn main() {
let generator = Arc::new(Mutex::new(SnowID::new(1).unwrap()));
let mut handles = vec![];
for thread_id in 0..4 {
let generator_clone = Arc::clone(&generator);
handles.push(thread::spawn(move || {
let mut ids = HashSet::new();
let mut rng = rng();
for i in 0..5 {
let id = {
let generator_lock = generator_clone.lock().unwrap();
generator_lock.generate()
};
let (ts, node, seq) = {
let generator_lock = generator_clone.lock().unwrap();
generator_lock.extract.decompose(id)
};
println!("Thread {thread_id} generated ID {i} (ts={ts}, node={node}, seq={seq})");
assert!(ids.insert(id), "Duplicate ID generated!");
let delay = rng.random_range(0..=9);
thread::sleep(Duration::from_millis(delay));
}
ids
}));
}
let mut all_ids = HashSet::new();
for handle in handles {
let thread_ids = handle.join().unwrap();
all_ids.extend(thread_ids);
}
println!("\nTotal unique IDs generated: {}", all_ids.len());
let mut ids: Vec<_> = all_ids.into_iter().collect();
ids.sort_unstable();
for i in 1..ids.len() {
assert!(ids[i] > ids[i - 1], "IDs not monotonically increasing!");
}
println!("All IDs are unique and monotonically increasing!");
}