Skip to main content

min_id/
lib.rs

1use rand::distributions::{Distribution, Uniform};
2
3const ALPHABET: &[u8] = b"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
4
5/// generate_id returns a string between 15 and 24 characters long with the characters chosen
6/// from the base-58 alphabet.
7pub 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}