use siphasher::sip::SipHasher;
use std::hash::{Hash, Hasher};
use std::path::Path;
pub fn stable_hash_with(f: impl FnOnce(&mut SipHasher)) -> u64 {
let mut hasher = SipHasher::new();
f(&mut hasher);
hasher.finish()
}
pub fn stable_hash_str(seed: u64, value: &str) -> u64 {
stable_hash_with(|hasher| {
seed.hash(hasher);
value.hash(hasher);
})
}
pub fn stable_hash_path(seed: u64, path: &Path) -> u64 {
stable_hash_with(|hasher| {
seed.hash(hasher);
path.to_string_lossy().hash(hasher);
})
}
pub fn derive_epoch_seed(base_seed: u64, epoch: u64) -> u64 {
base_seed ^ epoch
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn stable_hash_str_is_deterministic() {
let result = stable_hash_str(42, "hello");
assert_eq!(result, 16678829552985060110);
}
#[test]
fn stable_hash_with_produces_consistent_results() {
let a = stable_hash_str(0, "test");
let b = stable_hash_str(0, "test");
assert_eq!(a, b);
}
}