use std::collections::hash_map::RandomState;
use std::hash::{BuildHasher, Hash, Hasher};
fn random_seed() -> u64 {
RandomState::new().build_hasher().finish()
}
fn random_numbers() -> impl Iterator<Item = u32> {
let mut random = random_seed() as u32;
std::iter::repeat_with(move || {
random ^= random << 13;
random ^= random >> 17;
random ^= random << 5;
random
})
}
pub fn random_alpha_chars() -> impl Iterator<Item = char> {
random_numbers()
.map(|r| (r & 255) as u8 as char)
.filter(|c| c.is_ascii_alphabetic())
}
fn hasher<T>(data: T) -> u64
where
T: Hash,
{
let mut hasher = std::hash::DefaultHasher::new();
data.hash(&mut hasher);
hasher.finish()
}
pub fn hash_path<P: AsRef<std::path::Path>>(p: P) -> String {
let h = hasher(p.as_ref());
h.to_string()
}