1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
extern crate crypto;
use crypto::digest::Digest;
use crypto::sha2::Sha384;
use rand::{thread_rng, Rng};

pub struct TokenGenerator {
    rng: rand::rngs::ThreadRng,
    sha: Sha384,
}

impl TokenGenerator {
    pub fn new() -> TokenGenerator {
        TokenGenerator {
            rng: thread_rng(),
            sha: Sha384::new(),
        }
    }

    pub fn generate(&mut self) -> String {
        let mut token = [0u8; 24];
        self.rng.fill(&mut token);
        self.sha.input(&token);
        let mut output = [0; 32];
        self.sha.result(&mut output);
        self.sha.reset();
        hex::encode(output)
    }
}