use crate::{Error, SmallUid};
use rand::Rng;
use std::time::{SystemTime, UNIX_EPOCH};
pub fn timestamp_gen() -> Result<u64, Error> {
let start = SystemTime::now();
let since_the_epoch = start.duration_since(UNIX_EPOCH)?;
let timestamp = since_the_epoch.as_millis() as u64;
Ok(timestamp)
}
pub fn random_gen() -> u64 {
rand::rng().random_range(0..(1 << 20))
}
pub fn gen() -> Result<SmallUid, Error> {
let timestamp = timestamp_gen()?;
let random = random_gen();
Ok(assemble(timestamp, random))
}
pub fn assemble(timestamp: u64, random: u64) -> SmallUid {
let timestamp = timestamp << 20;
let random_bits = 64 - random.leading_zeros();
let random = if random_bits > 44 {
random >> 44
} else {
random
};
SmallUid(timestamp | random)
}