use core::ops::{Range, RangeInclusive};
use std::process;
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::{SystemTime, UNIX_EPOCH};
static COUNTER: AtomicU64 = AtomicU64::new(0);
static PROCESS_SALT: AtomicU64 = AtomicU64::new(0);
pub fn unique_u64() -> u64 {
let pid = process::id() as u64;
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_nanos() as u64)
.unwrap_or(0);
let counter = COUNTER.fetch_add(1, Ordering::Relaxed);
let salt = process_salt();
let mixed = pid
.wrapping_mul(0x9E37_79B9_7F4A_7C15)
.wrapping_add(nanos.wrapping_mul(0xBF58_476D_1CE4_E5B9))
.wrapping_add(salt.wrapping_mul(0x94D0_49BB_1331_11EB))
^ counter.wrapping_mul(0xDA94_2042_E4DD_58B5);
stafford_mix13(mixed)
}
pub fn unique_name(len: usize) -> String {
encode_base32(len)
}
pub fn unique_base32(len: usize) -> String {
encode_base32(len)
}
pub fn unique_hex(len: usize) -> String {
const ALPHABET: &[u8; 16] = b"0123456789abcdef";
let mut out = String::with_capacity(len);
let mut state = unique_u64();
let mut bits_left = 64;
while out.len() < len {
if bits_left < 4 {
state = unique_u64();
bits_left = 64;
}
out.push(ALPHABET[(state & 0xF) as usize] as char);
state >>= 4;
bits_left -= 4;
}
out
}
fn encode_base32(len: usize) -> String {
const ALPHABET: &[u8; 32] = b"0123456789ABCDEFGHJKMNPQRSTVWXYZ";
let mut out = String::with_capacity(len);
let mut state = unique_u64();
let mut bits_left = 64;
while out.len() < len {
if bits_left < 5 {
state = unique_u64();
bits_left = 64;
}
out.push(ALPHABET[(state & 0x1F) as usize] as char);
state >>= 5;
bits_left -= 5;
}
out
}
#[inline]
fn stafford_mix13(mut z: u64) -> u64 {
z = (z ^ (z >> 30)).wrapping_mul(0xBF58_476D_1CE4_E5B9);
z = (z ^ (z >> 27)).wrapping_mul(0x94D0_49BB_1331_11EB);
z ^ (z >> 31)
}
fn process_salt() -> u64 {
let current = PROCESS_SALT.load(Ordering::Relaxed);
if current != 0 {
return current;
}
let pid = process::id() as u64;
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_nanos() as u64)
.unwrap_or(0);
let candidate = stafford_mix13(
pid.wrapping_mul(0x9E37_79B9_7F4A_7C15) ^ nanos.wrapping_mul(0xC2B2_AE3D_27D4_EB4F),
)
.max(1);
match PROCESS_SALT.compare_exchange(0, candidate, Ordering::Relaxed, Ordering::Relaxed) {
Ok(_) => candidate,
Err(existing) => existing,
}
}
#[inline]
fn bounded_u64(n: u64) -> u64 {
debug_assert!(n != 0, "bounded_u64 requires n > 0");
let mut x = unique_u64();
let mut m: u128 = (x as u128).wrapping_mul(n as u128);
let mut l: u64 = m as u64;
if l < n {
let t: u64 = n.wrapping_neg() % n;
while l < t {
x = unique_u64();
m = (x as u128).wrapping_mul(n as u128);
l = m as u64;
}
}
(m >> 64) as u64
}
pub fn range_u64(range: Range<u64>) -> u64 {
let Range { start, end } = range;
assert!(start < end, "range_u64: empty range {start}..{end}");
let span = end - start;
start + bounded_u64(span)
}
pub fn range_inclusive_u64(range: RangeInclusive<u64>) -> u64 {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_u64: empty range {start}..={end}"
);
if start == 0 && end == u64::MAX {
return unique_u64();
}
let span = end - start + 1;
start + bounded_u64(span)
}
pub fn range_u32(range: Range<u32>) -> u32 {
let Range { start, end } = range;
assert!(start < end, "range_u32: empty range {start}..{end}");
let span = (end - start) as u64;
(start as u64 + bounded_u64(span)) as u32
}
pub fn range_inclusive_u32(range: RangeInclusive<u32>) -> u32 {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_u32: empty range {start}..={end}"
);
let span = (end as u64) - (start as u64) + 1;
(start as u64 + bounded_u64(span)) as u32
}
pub fn range_i64(range: Range<i64>) -> i64 {
let Range { start, end } = range;
assert!(start < end, "range_i64: empty range {start}..{end}");
let span = (end as i128 - start as i128) as u64;
let offset = bounded_u64(span);
((start as i128) + (offset as i128)) as i64
}
pub fn range_inclusive_i64(range: RangeInclusive<i64>) -> i64 {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_i64: empty range {start}..={end}"
);
if start == i64::MIN && end == i64::MAX {
return unique_u64() as i64;
}
let span = ((end as i128) - (start as i128) + 1) as u64;
let offset = bounded_u64(span);
((start as i128) + (offset as i128)) as i64
}
pub fn range_i32(range: Range<i32>) -> i32 {
let Range { start, end } = range;
assert!(start < end, "range_i32: empty range {start}..{end}");
let span = (end as i64 - start as i64) as u64;
let offset = bounded_u64(span);
((start as i64) + (offset as i64)) as i32
}
pub fn range_inclusive_i32(range: RangeInclusive<i32>) -> i32 {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_i32: empty range {start}..={end}"
);
let span = ((end as i64) - (start as i64) + 1) as u64;
let offset = bounded_u64(span);
((start as i64) + (offset as i64)) as i32
}
#[inline]
fn bounded_u128(n: u128) -> u128 {
debug_assert!(n != 0, "bounded_u128 requires n > 0");
let mut x = draw_u128();
let (mut hi, mut lo) = mul_128_full(x, n);
if lo < n {
let t: u128 = n.wrapping_neg() % n;
while lo < t {
x = draw_u128();
let (h, l) = mul_128_full(x, n);
hi = h;
lo = l;
}
}
let _ = x;
hi
}
#[inline]
fn draw_u128() -> u128 {
((unique_u64() as u128) << 64) | (unique_u64() as u128)
}
#[inline]
fn mul_128_full(a: u128, b: u128) -> (u128, u128) {
let a_lo: u64 = a as u64;
let a_hi: u64 = (a >> 64) as u64;
let b_lo: u64 = b as u64;
let b_hi: u64 = (b >> 64) as u64;
let p00: u128 = (a_lo as u128) * (b_lo as u128);
let p01: u128 = (a_lo as u128) * (b_hi as u128);
let p10: u128 = (a_hi as u128) * (b_lo as u128);
let p11: u128 = (a_hi as u128) * (b_hi as u128);
let mask_lo: u128 = 0xFFFF_FFFF_FFFF_FFFF;
let mid: u128 = (p00 >> 64) + (p01 & mask_lo) + (p10 & mask_lo);
let low: u128 = (p00 & mask_lo) | (mid << 64);
let high: u128 = p11 + (p01 >> 64) + (p10 >> 64) + (mid >> 64);
(high, low)
}
pub fn range_u8(range: Range<u8>) -> u8 {
let Range { start, end } = range;
assert!(start < end, "range_u8: empty range {start}..{end}");
let span = (end - start) as u64;
(start as u64 + bounded_u64(span)) as u8
}
pub fn range_inclusive_u8(range: RangeInclusive<u8>) -> u8 {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_u8: empty range {start}..={end}"
);
let span = (end as u64) - (start as u64) + 1;
(start as u64 + bounded_u64(span)) as u8
}
pub fn range_u16(range: Range<u16>) -> u16 {
let Range { start, end } = range;
assert!(start < end, "range_u16: empty range {start}..{end}");
let span = (end - start) as u64;
(start as u64 + bounded_u64(span)) as u16
}
pub fn range_inclusive_u16(range: RangeInclusive<u16>) -> u16 {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_u16: empty range {start}..={end}"
);
let span = (end as u64) - (start as u64) + 1;
(start as u64 + bounded_u64(span)) as u16
}
pub fn range_u128(range: Range<u128>) -> u128 {
let Range { start, end } = range;
assert!(start < end, "range_u128: empty range {start}..{end}");
let span = end - start;
start + bounded_u128(span)
}
pub fn range_inclusive_u128(range: RangeInclusive<u128>) -> u128 {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_u128: empty range {start}..={end}"
);
if start == 0 && end == u128::MAX {
return draw_u128();
}
let span = end - start + 1;
start + bounded_u128(span)
}
pub fn range_usize(range: Range<usize>) -> usize {
let Range { start, end } = range;
assert!(start < end, "range_usize: empty range {start}..{end}");
let span = (end - start) as u64;
(start as u64 + bounded_u64(span)) as usize
}
pub fn range_inclusive_usize(range: RangeInclusive<usize>) -> usize {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_usize: empty range {start}..={end}"
);
if start == 0 && end == usize::MAX {
#[cfg(target_pointer_width = "64")]
{
return unique_u64() as usize;
}
#[cfg(not(target_pointer_width = "64"))]
{
let span = (end as u64) - (start as u64) + 1;
return (start as u64 + bounded_u64(span)) as usize;
}
}
let span = (end - start) as u64 + 1;
(start as u64 + bounded_u64(span)) as usize
}
pub fn range_i8(range: Range<i8>) -> i8 {
let Range { start, end } = range;
assert!(start < end, "range_i8: empty range {start}..{end}");
let span = (end as i64 - start as i64) as u64;
let offset = bounded_u64(span);
((start as i64) + (offset as i64)) as i8
}
pub fn range_inclusive_i8(range: RangeInclusive<i8>) -> i8 {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_i8: empty range {start}..={end}"
);
let span = ((end as i64) - (start as i64) + 1) as u64;
let offset = bounded_u64(span);
((start as i64) + (offset as i64)) as i8
}
pub fn range_i16(range: Range<i16>) -> i16 {
let Range { start, end } = range;
assert!(start < end, "range_i16: empty range {start}..{end}");
let span = (end as i64 - start as i64) as u64;
let offset = bounded_u64(span);
((start as i64) + (offset as i64)) as i16
}
pub fn range_inclusive_i16(range: RangeInclusive<i16>) -> i16 {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_i16: empty range {start}..={end}"
);
let span = ((end as i64) - (start as i64) + 1) as u64;
let offset = bounded_u64(span);
((start as i64) + (offset as i64)) as i16
}
pub fn range_i128(range: Range<i128>) -> i128 {
let Range { start, end } = range;
assert!(start < end, "range_i128: empty range {start}..{end}");
let span = (end as u128).wrapping_sub(start as u128);
let offset = bounded_u128(span);
(start as u128).wrapping_add(offset) as i128
}
pub fn range_inclusive_i128(range: RangeInclusive<i128>) -> i128 {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_i128: empty range {start}..={end}"
);
if start == i128::MIN && end == i128::MAX {
return draw_u128() as i128;
}
let span = (end as u128).wrapping_sub(start as u128) + 1;
let offset = bounded_u128(span);
(start as u128).wrapping_add(offset) as i128
}
pub fn range_isize(range: Range<isize>) -> isize {
let Range { start, end } = range;
assert!(start < end, "range_isize: empty range {start}..{end}");
let span = (end as i128 - start as i128) as u64;
let offset = bounded_u64(span);
((start as i128) + (offset as i128)) as isize
}
pub fn range_inclusive_isize(range: RangeInclusive<isize>) -> isize {
let (start, end) = range.into_inner();
assert!(
start <= end,
"range_inclusive_isize: empty range {start}..={end}"
);
if start == isize::MIN && end == isize::MAX {
#[cfg(target_pointer_width = "64")]
{
return unique_u64() as isize;
}
#[cfg(not(target_pointer_width = "64"))]
{
let span = ((end as i128) - (start as i128) + 1) as u64;
let offset = bounded_u64(span);
return ((start as i128) + (offset as i128)) as isize;
}
}
let span = ((end as i128) - (start as i128) + 1) as u64;
let offset = bounded_u64(span);
((start as i128) + (offset as i128)) as isize
}
pub fn random_string(len: usize, charset: &[u8]) -> String {
assert!(
!charset.is_empty(),
"random_string: charset must be non-empty"
);
assert!(
charset.iter().all(|&b| b < 128),
"random_string: charset must be ASCII (every byte < 128)"
);
let n = charset.len() as u64;
let mut out = String::with_capacity(len);
for _ in 0..len {
let idx = bounded_u64(n) as usize;
out.push(charset[idx] as char);
}
out
}
#[inline]
pub fn random_alphanumeric(len: usize) -> String {
random_string(len, crate::charsets::ALPHANUMERIC)
}
#[inline]
pub fn random_alpha(len: usize) -> String {
random_string(len, crate::charsets::ALPHA)
}
#[inline]
pub fn random_numeric(len: usize) -> String {
random_string(len, crate::charsets::NUMERIC)
}
#[inline]
pub fn random_hex_string(len: usize) -> String {
random_string(len, crate::charsets::HEX_LOWER)
}
#[cfg(test)]
mod tests {
use super::*;
use std::collections::HashSet;
#[test]
fn two_calls_differ() {
assert_ne!(unique_u64(), unique_u64());
}
#[test]
fn name_meets_exact_length() {
for len in [1, 4, 8, 16, 32, 64, 128] {
let n = unique_name(len);
assert_eq!(n.len(), len, "length {len}");
}
}
#[test]
fn name_uses_crockford_alphabet() {
let n = unique_name(256);
for c in n.chars() {
assert!(
c.is_ascii_digit() || c.is_ascii_uppercase(),
"char {c:?} outside Crockford alphabet"
);
assert!(!matches!(c, 'I' | 'L' | 'O' | 'U'), "ambiguous char {c}");
}
}
#[test]
fn names_are_unique_across_calls() {
let mut set = HashSet::with_capacity(10_000);
for _ in 0..10_000 {
assert!(set.insert(unique_name(16)));
}
}
#[test]
fn unique_u64_collision_free_at_scale() {
let n = 1_000_000;
let mut set = HashSet::with_capacity(n);
for _ in 0..n {
assert!(set.insert(unique_u64()));
}
assert_eq!(set.len(), n);
}
#[test]
fn unique_hex_exact_length_and_alphabet() {
for len in [1, 7, 8, 9, 16, 32, 64, 128] {
let s = unique_hex(len);
assert_eq!(s.len(), len, "length {len}");
assert!(s.chars().all(|c| c.is_ascii_hexdigit()));
}
}
#[test]
fn unique_base32_exact_length() {
for len in [1, 5, 8, 13, 32, 64] {
let s = unique_base32(len);
assert_eq!(s.len(), len);
}
}
#[test]
fn alphabet_distribution_is_reasonable() {
let sample: String = (0..100_000)
.map(|_| unique_base32(1).chars().next().unwrap())
.collect();
let mut counts = [0u32; 32];
const ALPHABET: &[u8; 32] = b"0123456789ABCDEFGHJKMNPQRSTVWXYZ";
for c in sample.chars() {
let idx = ALPHABET
.iter()
.position(|&b| b as char == c)
.expect("char from Crockford alphabet");
counts[idx] += 1;
}
let n = sample.len() as f64;
let expected = n / 32.0;
let chi: f64 = counts
.iter()
.map(|&c| {
let diff = c as f64 - expected;
diff * diff / expected
})
.sum();
assert!(chi < 100.0, "chi-squared {chi} too high (alphabet skew)");
}
#[test]
fn hex_distribution_is_reasonable() {
let sample: String = unique_hex(100_000);
let mut counts = [0u32; 16];
for c in sample.chars() {
let v = c.to_digit(16).unwrap() as usize;
counts[v] += 1;
}
let n = sample.len() as f64;
let expected = n / 16.0;
let chi: f64 = counts
.iter()
.map(|&c| {
let diff = c as f64 - expected;
diff * diff / expected
})
.sum();
assert!(chi < 60.0, "chi-squared {chi} too high (hex skew)");
}
#[test]
fn zero_length_yields_empty_string() {
assert_eq!(unique_name(0), "");
assert_eq!(unique_hex(0), "");
assert_eq!(unique_base32(0), "");
}
#[test]
fn process_salt_is_stable_within_process() {
let a = process_salt();
let b = process_salt();
assert_eq!(a, b);
assert_ne!(a, 0);
}
#[test]
fn range_u64_bounds() {
for _ in 0..10_000 {
let n = range_u64(100..200);
assert!((100..200).contains(&n));
}
}
#[test]
fn range_u64_single_value_window() {
for _ in 0..1000 {
assert_eq!(range_u64(7..8), 7);
}
}
#[test]
fn range_inclusive_u64_die_roll() {
let mut faces = [0u32; 6];
for _ in 0..10_000 {
let d = range_inclusive_u64(1..=6);
assert!((1..=6).contains(&d));
faces[(d - 1) as usize] += 1;
}
for (i, &c) in faces.iter().enumerate() {
assert!(c > 0, "face {} never appeared in 10000 rolls", i + 1);
}
}
#[test]
fn range_inclusive_u64_single_value() {
for _ in 0..1000 {
assert_eq!(range_inclusive_u64(42..=42), 42);
}
}
#[test]
fn range_inclusive_u64_full_width() {
let a = range_inclusive_u64(0..=u64::MAX);
let b = range_inclusive_u64(0..=u64::MAX);
assert_ne!(a, b);
}
#[test]
fn range_u32_bounds() {
for _ in 0..10_000 {
let n = range_u32(0..256);
assert!(n < 256);
}
}
#[test]
fn range_inclusive_u32_full_width() {
for _ in 0..1000 {
let _ = range_inclusive_u32(0..=u32::MAX);
}
}
#[test]
fn range_i64_negative() {
for _ in 0..10_000 {
let n = range_i64(-100..-50);
assert!((-100..-50).contains(&n));
}
}
#[test]
fn range_i64_mixed_sign() {
let mut saw_neg = false;
let mut saw_pos = false;
for _ in 0..10_000 {
let n = range_i64(-100..100);
assert!((-100..100).contains(&n));
if n < 0 {
saw_neg = true;
}
if n >= 0 {
saw_pos = true;
}
}
assert!(saw_neg && saw_pos);
}
#[test]
fn range_inclusive_i64_full_width() {
let _ = range_inclusive_i64(i64::MIN..=i64::MAX);
}
#[test]
fn range_i32_bounds() {
for _ in 0..10_000 {
let n = range_i32(-1000..1000);
assert!((-1000..1000).contains(&n));
}
}
#[test]
fn range_inclusive_i32_full_width() {
for _ in 0..1000 {
let _ = range_inclusive_i32(i32::MIN..=i32::MAX);
}
}
#[test]
#[should_panic(expected = "empty range")]
fn range_u64_panics_on_empty() {
let _ = range_u64(10..10);
}
#[test]
#[should_panic(expected = "empty range")]
#[allow(clippy::reversed_empty_ranges)]
fn range_u64_panics_on_reverse() {
let _ = range_u64(10..5);
}
#[test]
#[should_panic(expected = "empty range")]
#[allow(clippy::reversed_empty_ranges)]
fn range_inclusive_u64_panics_on_reverse() {
let _ = range_inclusive_u64(10..=5);
}
#[test]
#[should_panic(expected = "empty range")]
#[allow(clippy::reversed_empty_ranges)]
fn range_i64_panics_on_reverse() {
let _ = range_i64(5..-5);
}
#[test]
fn range_uniformity_chi_squared() {
let mut counts = [0u32; 100];
for _ in 0..100_000 {
let v = range_u32(0..100);
counts[v as usize] += 1;
}
let expected = 100_000.0 / 100.0;
let chi: f64 = counts
.iter()
.map(|&c| {
let diff = c as f64 - expected;
diff * diff / expected
})
.sum();
assert!(
chi < 250.0,
"chi-squared {chi} too high — bounded-range output is biased"
);
}
}