use rand::{Rng, SeedableRng, rngs::StdRng};
use std::{
hash::{DefaultHasher, Hash, Hasher},
time::{SystemTime, UNIX_EPOCH},
};
pub fn new(size: usize) -> Vec<u8> {
let mut buf = vec![0; size];
rand::rng().fill_bytes(&mut buf);
buf
}
pub fn generate(secret: &[u8], size: usize) -> Vec<u8> {
let time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs()
.to_be_bytes();
let mut hasher = DefaultHasher::new();
let s = vec![
secret, &time,
];
s.hash(&mut hasher);
let mut rng = StdRng::seed_from_u64(hasher.finish());
let mut buf = vec![0; size];
rng.fill_bytes(&mut buf);
buf
}
#[cfg(test)]
mod tests {
use std::{thread::sleep, time::Duration};
use super::*;
#[test]
fn test() {
const SIZE: usize = 160;
let secret = new(SIZE);
let gen1 = generate(
&secret, SIZE,
);
let gen2 = generate(
&secret, SIZE,
);
assert_eq!(
gen1,
gen2
);
}
#[test]
fn test_different() {
const SIZE: usize = 160;
let secret = new(SIZE);
let gen1 = generate(
&secret, SIZE,
);
sleep(Duration::from_secs(2));
let gen2 = generate(
&secret, SIZE,
);
assert_ne!(
gen1,
gen2
);
}
}