millipede-core 0.1.1

Core primitives for the Millipede web crawler: request model, storage traits, events, errors, configuration.
Documentation
use std::sync::{
    LazyLock,
    atomic::{AtomicU64, Ordering},
};

static STATE: LazyLock<AtomicU64> = LazyLock::new(|| {
    let nanos = std::time::SystemTime::now()
        .duration_since(std::time::UNIX_EPOCH)
        .unwrap_or_default()
        .as_nanos() as u64;
    AtomicU64::new(nanos ^ 0x9e37_79b9_7f4a_7c15)
});

pub(crate) fn rand_u64() -> u64 {
    let mut value = STATE
        .fetch_add(0x9e37_79b9_7f4a_7c15, Ordering::Relaxed)
        .wrapping_add(0x9e37_79b9_7f4a_7c15);
    value = (value ^ (value >> 30)).wrapping_mul(0xbf58_476d_1ce4_e5b9);
    value = (value ^ (value >> 27)).wrapping_mul(0x94d0_49bb_1331_11eb);
    value ^ (value >> 31)
}

#[cfg(test)]
mod tests {
    #[test]
    fn consecutive_values_differ() {
        assert_ne!(super::rand_u64(), super::rand_u64());
    }
}