#[must_use]
pub fn jitter(delay_ms: u64) -> u64 {
let span = delay_ms / 5;
if span == 0 {
return delay_ms;
}
let mut bytes = [0u8; 8];
let entropy = match getrandom::fill(&mut bytes) {
Ok(()) => u64::from_le_bytes(bytes),
Err(_) => return delay_ms,
};
let offset = entropy % (2 * span + 1);
delay_ms - span + offset
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn jitter_stays_within_band() {
for _ in 0..100 {
let j = jitter(1000);
assert!((800..=1200).contains(&j), "jitter out of band: {j}");
}
assert_eq!(jitter(3), 3);
}
}