mf_model/
id_generator.rs

1use nanoid::nanoid;
2
3pub struct IdGenerator;
4
5impl IdGenerator {
6    pub fn get_id() -> String {
7        // 使用数字和大写字母,生成12位的ID
8        // 使用自定义字符集:数字(0-9)和大写字母(A-Z),去掉容易混淆的字符
9        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        // 测试新ID生成器性能
29        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        // 生成大量ID并检查唯一性
45        for _ in 0..ITERATIONS {
46            let id = IdGenerator::get_id();
47            assert!(ids.insert(id), "发现重复ID!");
48        }
49
50        println!("成功生成 {} 个唯一ID", ITERATIONS);
51
52        // 计算碰撞概率
53        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}