light_tool/
random.rs

1use crate::timestamp;
2
3/// 基于异或位移实现
4struct XorShiftRng {
5    state: u64,
6}
7
8impl XorShiftRng {
9    fn new(seed: Option<u64>) -> Self {
10        let seed = seed.unwrap_or(timestamp::nano_seconds());
11        XorShiftRng { state: seed }
12    }
13
14    fn next_u64(&mut self) -> u64 {
15        self.state ^= self.state << 13;
16        self.state ^= self.state >> 7;
17        self.state ^= self.state >> 17;
18        self.state
19    }
20
21    fn gen_range(&mut self, min: u64, max: u64) -> u64 {
22        min + self.next_u64() % (max - min)
23    }
24
25    fn gen_letter(&mut self, letters :&str) -> char {
26        let idx = self.gen_range(0, letters.len() as u64) as usize;
27        letters.as_bytes()[idx] as char
28    }
29
30    fn gen_random(&mut self, s :&str, length: usize) -> String {
31        (0..length).map(|_| self.gen_letter(s)).collect()
32    }
33}
34
35/// Generate random string
36///
37/// # Example
38///
39/// ```no_run
40/// use light_tool::random;
41/// println!("random string: {}", random::str("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10))
42/// ```
43pub fn str(s :&str, len: usize) -> String {
44    XorShiftRng::new(None).gen_random(s, len)
45}
46
47/// Generate random number
48///
49/// # Example
50///
51/// ```no_run
52/// use light_tool::random;
53/// println!("random number: {}", random::num(6))
54/// ```
55pub fn num(len: usize) -> String {
56    str("0123456789", len)
57}
58
59/// Generate random alpha
60///
61/// # Example
62/// ```no_run
63/// use light_tool::random;
64/// println!("random alpha: {}", random::alpha(6))
65/// ```
66pub fn alpha(len: usize) -> String {
67    str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", len)
68}
69
70/// Generate random alpha number
71///
72/// # Example
73/// ```no_run
74/// use light_tool::random;
75/// println!("random alpha number: {}", random::alpha_num(6))
76/// ```
77pub fn alpha_num(len: usize) -> String {
78    str("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", len)
79}
80
81/// Generate random number in range
82///
83/// # Example
84/// ```no_run
85/// use light_tool::random;
86/// println!("random range: {}", random::range(1, 10))
87/// ```
88pub fn range(min: u64, max: u64) -> u64 {
89    XorShiftRng::new(None).gen_range(min, max)
90}
91
92#[cfg(test)]
93mod tests {
94    use super::*;
95
96    #[test]
97    fn test_random_str() {
98        println!("random_str: {}", str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 10));
99    }
100
101    #[test]
102    fn test_random_num() {
103        println!("random_num: {}", num(6));
104    }
105
106    #[test]
107    fn test_random_alpha() {
108        println!("random_alpha: {}", alpha(8));
109    }
110
111    #[test]
112    fn test_random_alpha_num() {
113        println!("random_alpha_num: {}", alpha_num(16));
114    }
115
116    #[test]
117    fn test_random_range() {
118        println!("random_range: {}", range(1, 3));
119    }
120}