1use rand::distributions::{Distribution, Uniform};
2
3const ALPHABET: &[u8] = b"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
4
5pub fn generate_id() -> String {
8 let mut rng = rand::thread_rng();
9
10 let uniform_len: Uniform<u32> = Uniform::new_inclusive(15, 24);
11 let len = uniform_len.sample(&mut rng);
12 let mut s = String::with_capacity(len as usize);
13
14 let uniform_chars: Uniform<u32> = Uniform::new_inclusive(0, 57);
15 for _ in 0..len {
16 s.push(ALPHABET[uniform_chars.sample(&mut rng) as usize] as char);
17 }
18
19 s
20}
21
22#[cfg(test)]
23mod tests {
24 use crate::{generate_id, ALPHABET};
25
26 #[test]
27 fn test_generate_id() {
28 let a = generate_id();
29 let b = generate_id();
30
31 assert!(a.len() >= 15 && a.len() <= 24);
32 assert!(b.len() >= 15 && b.len() <= 24);
33
34 for c in a.as_bytes().iter() {
35 assert!(ALPHABET.contains(c));
36 }
37 for c in b.as_bytes().iter() {
38 assert!(ALPHABET.contains(&c as &u8));
39 }
40
41 assert_ne!(a, b);
42 }
43}