1use crate::timestamp;
2
3struct 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
35pub fn str(s :&str, len: usize) -> String {
44 XorShiftRng::new(None).gen_random(s, len)
45}
46
47pub fn num(len: usize) -> String {
56 str("0123456789", len)
57}
58
59pub fn alpha(len: usize) -> String {
67 str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", len)
68}
69
70pub fn alpha_num(len: usize) -> String {
78 str("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", len)
79}
80
81pub 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}