1use nanoid::nanoid;
2
3pub struct IdGenerator;
4
5impl IdGenerator {
6 pub fn get_id() -> String {
7 const ALPHABET: [char; 32] = [
10 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c',
11 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r',
12 's', 't', 'u', 'v', 'w', 'x',
13 ];
14
15 nanoid!(12, &ALPHABET)
16 }
17}
18
19#[cfg(test)]
20mod tests {
21 use super::*;
22 use std::time::Instant;
23
24 #[test]
25 fn test_id_generation_performance() {
26 const ITERATIONS: usize = 1_000_000;
27
28 let start = Instant::now();
30 for _ in 0..ITERATIONS {
31 let _id = IdGenerator::get_id();
32 }
33 let new_duration = start.elapsed();
34
35 println!("生成 {} 个新ID耗时: {:?}", ITERATIONS, new_duration);
36 println!("平均每个ID生成时间: {:?}", new_duration / ITERATIONS as u32);
37 }
38
39 #[test]
40 fn test_id_uniqueness() {
41 const ITERATIONS: usize = 1_000_000;
42 let mut ids = std::collections::HashSet::with_capacity(ITERATIONS);
43
44 for _ in 0..ITERATIONS {
46 let id = IdGenerator::get_id();
47 assert!(ids.insert(id), "发现重复ID!");
48 }
49
50 println!("成功生成 {} 个唯一ID", ITERATIONS);
51
52 let total_possible = 32u64.pow(12);
54 let collision_probability =
55 1.0 - (1.0 - 1.0 / (total_possible as f64)).powi(ITERATIONS as i32);
56 println!("理论碰撞概率: {:.10}%", collision_probability * 100.0);
57 }
58}