2019-09-06 05:04:58 +02:00
|
|
|
use std::time::Duration;
|
|
|
|
use uuid::{Builder, Uuid};
|
|
|
|
|
2019-10-07 00:41:30 +02:00
|
|
|
use rand::distributions::Alphanumeric;
|
|
|
|
use rand::{thread_rng, Rng};
|
|
|
|
|
2019-09-06 05:04:58 +02:00
|
|
|
pub type SID = [u8; 4];
|
|
|
|
|
|
|
|
fn uuid_from_u64_u32(a: u64, b: u32, sid: &SID) -> Uuid {
|
|
|
|
let mut v: Vec<u8> = Vec::with_capacity(16);
|
|
|
|
v.extend_from_slice(&a.to_be_bytes());
|
|
|
|
v.extend_from_slice(&b.to_be_bytes());
|
|
|
|
v.extend_from_slice(sid);
|
|
|
|
|
|
|
|
Builder::from_slice(v.as_slice()).unwrap().build()
|
|
|
|
}
|
|
|
|
|
|
|
|
// SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap();
|
|
|
|
pub fn uuid_from_duration(d: Duration, sid: &SID) -> Uuid {
|
|
|
|
uuid_from_u64_u32(d.as_secs(), d.subsec_nanos(), sid)
|
|
|
|
}
|
|
|
|
|
2019-10-07 00:41:30 +02:00
|
|
|
pub fn password_from_random() -> String {
|
|
|
|
let rand_string: String = thread_rng().sample_iter(&Alphanumeric).take(48).collect();
|
|
|
|
rand_string
|
|
|
|
}
|
|
|
|
|
2019-09-06 05:04:58 +02:00
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use crate::utils::uuid_from_duration;
|
|
|
|
use std::time::Duration;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_utils_uuid_from_duration() {
|
|
|
|
let u1 = uuid_from_duration(Duration::from_secs(1), &[0xff; 4]);
|
|
|
|
assert_eq!(
|
|
|
|
"00000000-0000-0001-0000-0000ffffffff",
|
|
|
|
u1.to_hyphenated().to_string()
|
|
|
|
);
|
|
|
|
|
|
|
|
let u2 = uuid_from_duration(Duration::from_secs(1000), &[0xff; 4]);
|
|
|
|
assert_eq!(
|
|
|
|
"00000000-0000-03e8-0000-0000ffffffff",
|
|
|
|
u2.to_hyphenated().to_string()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|