use std::sync::atomic::{AtomicU64, Ordering};
use std::time::{SystemTime, UNIX_EPOCH};
pub(crate) static HASH_COUNTER: AtomicU64 = AtomicU64::new(0);
pub(super) fn simple_hash_fraction_for(task_id: &str) -> f64 {
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_nanos() as u64;
let seq = HASH_COUNTER.fetch_add(1, Ordering::Relaxed);
let task_hash = hash_task_id(task_id);
let seed = nanos ^ seq ^ task_hash;
let hash = seed
.wrapping_mul(6364136223846793005)
.wrapping_add(1442695040888963407);
(hash % 10000) as f64 / 10000.0
}
pub(crate) fn simple_hash_index_for(len: usize, task_id: &str) -> usize {
if len == 0 {
return 0;
}
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_nanos() as u64;
let seq = HASH_COUNTER.fetch_add(1, Ordering::Relaxed);
let task_hash = hash_task_id(task_id);
let seed = nanos ^ seq ^ task_hash;
let hash = seed
.wrapping_mul(6364136223846793005)
.wrapping_add(1442695040888963407);
(hash as usize) % len
}
fn hash_task_id(task_id: &str) -> u64 {
task_id
.bytes()
.fold(0u64, |acc, b| acc.wrapping_mul(31).wrapping_add(b as u64))
}