use base64::engine::general_purpose::URL_SAFE_NO_PAD;
use base64::Engine;
pub fn random_token() -> String {
let mut buf = [0u8; 32];
fill_random(&mut buf);
URL_SAFE_NO_PAD.encode(buf)
}
#[cfg(unix)]
fn fill_random(buf: &mut [u8]) {
use std::io::Read;
let mut f = std::fs::File::open("/dev/urandom").expect("open /dev/urandom for OS entropy");
f.read_exact(buf)
.expect("read 32 bytes of OS entropy from /dev/urandom");
}
#[cfg(not(unix))]
fn fill_random(buf: &mut [u8]) {
use std::time::{SystemTime, UNIX_EPOCH};
let seed = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_nanos())
.unwrap_or(0);
for (i, b) in buf.iter_mut().enumerate() {
*b = (seed >> (i % 16)) as u8 ^ (i as u8).wrapping_mul(31);
}
}