From ba231bda3984bffac3f598794dc615ecf27113c5 Mon Sep 17 00:00:00 2001 From: Rawleenc Dev Date: Sat, 5 Apr 2025 15:08:13 +0200 Subject: [PATCH] feat: replace fastrand by rapidhash with custom generator --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- src/main.rs | 44 +++++++++++++++++++++++++++++++++++--------- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c0b6864..d28ce49 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,14 +3,14 @@ version = 4 [[package]] -name = "fastrand" -version = "2.3.0" +name = "rapidhash" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9813f789f95ee4fe6b4d01834404d7cccacbc3f6c029343af910b3c2835eb9f1" [[package]] name = "rpg" version = "1.0.0" dependencies = [ - "fastrand", + "rapidhash", ] diff --git a/Cargo.toml b/Cargo.toml index 0842511..2e18ece 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,4 +4,4 @@ version = "1.0.0" edition = "2021" [dependencies] -fastrand = "2.3.0" +rapidhash = "1.4.0" diff --git a/src/main.rs b/src/main.rs index 377ea33..a99496f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,30 @@ -use std::env; +use std::hash::Hasher; +use std::time::{SystemTime, UNIX_EPOCH}; +use std::{env, ops::Range}; +use rapidhash::RapidInlineHasher; + +pub struct HashRng { + state: u64, + counter: u64, +} + +impl HashRng { + pub fn new() -> Self { + let seed = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_nanos() as u64; // Tronqué à u64 + Self { state: seed, counter: 0 } + } + + pub fn next_in_range(&mut self, range: Range) -> usize { + let mut hasher = RapidInlineHasher::new(self.state); + hasher.write_u64(self.state); + hasher.write_u64(self.counter); + self.counter = self.counter.wrapping_add(1); + range.start + (hasher.finish() as usize % (range.end - range.start)) + } +} fn main() { let num_pseudonyms = env::args() @@ -9,12 +35,12 @@ fn main() { let adjectives = include_str!("../data/adjectives.txt").lines().collect::>(); let nouns = include_str!("../data/nouns.txt").lines().collect::>(); - (0..num_pseudonyms).for_each(|_| { - println!( - "{}-{}-{}", - adjectives[fastrand::usize(0..adjectives.len())], - nouns[fastrand::usize(0..nouns.len())], - fastrand::u32(0..1000) - ); - }); + let mut rng = HashRng::new(); + + for _ in 0..num_pseudonyms { + let adjective = adjectives[rng.next_in_range(0..adjectives.len())]; + let noun = nouns[rng.next_in_range(0..nouns.len())]; + let number = rng.next_in_range(0..1000); + println!("{adjective}-{noun}-{number}"); + } } \ No newline at end of file