1extern crate crypto;
2use crypto::digest::Digest;
3use crypto::sha2::Sha384;
4use rand::{thread_rng, Rng};
5
6pub struct TokenGenerator {
7 rng: rand::rngs::ThreadRng,
8 sha: Sha384,
9}
10
11impl TokenGenerator {
12 pub fn new() -> TokenGenerator {
13 TokenGenerator {
14 rng: thread_rng(),
15 sha: Sha384::new(),
16 }
17 }
18
19 pub fn generate(&mut self, length: usize) -> String {
20 let mut token = vec![0u8; length];
21 self.rng.fill(&mut token[..]);
22 self.sha.input(&token);
23 let mut output = [0; 48];
24 self.sha.result(&mut output);
25 self.sha.reset();
26 hex::encode(output)
27 }
28}