From 7f8734e16184a12434ac92e5bb93dc2d24aebaad Mon Sep 17 00:00:00 2001 From: Dominik Maier Date: Mon, 9 Nov 2020 21:04:46 +0100 Subject: [PATCH] time-based preseeded rand --- src/corpus/mod.rs | 2 +- src/engines/mod.rs | 2 +- src/inputs/bytes.rs | 2 +- src/utils.rs | 31 +++++++++++++++++++++++++------ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/corpus/mod.rs b/src/corpus/mod.rs index 0b0b18b3fc..d15e325d4e 100644 --- a/src/corpus/mod.rs +++ b/src/corpus/mod.rs @@ -308,7 +308,7 @@ mod tests { #[test] fn test_queuecorpus() { - let rand = Xoshiro256StarRand::new_rr(); + let rand = Xoshiro256StarRand::preseeded_rr(); let mut q = QueueCorpus::new(OnDiskCorpus::new(&rand, PathBuf::from("fancy/path"))); let i = BytesInput::new(vec![0; 4]); let t = Testcase::with_filename_rr(i, PathBuf::from("fancyfile")); diff --git a/src/engines/mod.rs b/src/engines/mod.rs index 50dff41fe5..2cb06daad8 100644 --- a/src/engines/mod.rs +++ b/src/engines/mod.rs @@ -211,7 +211,7 @@ mod tests { #[test] fn test_engine() { - let rand = Xoshiro256StarRand::new_rr(); + let rand = Xoshiro256StarRand::preseeded_rr(); let mut corpus = InMemoryCorpus::::new(&rand); let testcase = Testcase::new_rr(BytesInput::new(vec![0; 4])); diff --git a/src/inputs/bytes.rs b/src/inputs/bytes.rs index d8a36d1f6c..b096dab1bb 100644 --- a/src/inputs/bytes.rs +++ b/src/inputs/bytes.rs @@ -46,7 +46,7 @@ mod tests { #[test] fn test_input() { - let mut rand = Xoshiro256StarRand::new(); + let mut rand = Xoshiro256StarRand::preseeded(); assert_ne!(rand.next(), rand.next()); assert!(rand.below(100) < 100); assert_eq!(rand.below(1), 0); diff --git a/src/utils.rs b/src/utils.rs index 29da8acb96..96068bb76e 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -4,6 +4,8 @@ use std::cell::RefCell; use std::debug_assert; use std::fmt::Debug; use std::rc::Rc; +use std::time::{SystemTime, UNIX_EPOCH}; + use xxhash_rust::xxh3::xxh3_64_with_seed; /// Ways to get random around here @@ -106,15 +108,29 @@ impl Rand for Xoshiro256StarRand { } impl Xoshiro256StarRand { - pub fn new() -> Self { + /// Creates a new Xoshiro rand with the given seed + pub fn new(seed: u64) -> Self { let mut ret: Xoshiro256StarRand = Default::default(); - ret.set_seed(0); // TODO: Proper random seed? + ret.set_seed(seed); // TODO: Proper random seed? ret } - pub fn new_rr() -> Rc> { - Rc::new(RefCell::new(Xoshiro256StarRand::new())) + /// Creates a new Xoshiro rand with the given seed, wrapped in a Rc>. + pub fn new_rr(seed: u64) -> Rc> { + Rc::new(RefCell::new(Self::new(seed))) } + + /// Creates a rand instance, pre-seeded with the current time in nanoseconds. + pub fn preseeded() -> Self { + let seed = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_nanos() as u64; + Self::new(seed) + } + + /// Creates a new rand instance, pre-seeded + pub fn preseeded_rr() -> Rc> { + Rc::new(RefCell::new(Self::preseeded())) + } + } /// Get the next higher power of two @@ -134,7 +150,7 @@ mod tests { #[test] fn test_rand() { - let mut rand = Xoshiro256StarRand::new(); + let mut rand = Xoshiro256StarRand::preseeded(); assert_ne!(rand.next(), rand.next()); assert!(rand.below(100) < 100); assert_eq!(rand.below(1), 0); @@ -142,6 +158,7 @@ mod tests { assert!(rand.between(11, 20) > 10); } + use std::cell::RefCell; use std::rc::Rc; struct HasRandTest @@ -164,7 +181,7 @@ mod tests { #[test] fn test_has_rand() { - let rand = Xoshiro256StarRand::new_rr(); + let rand = Xoshiro256StarRand::preseeded_rr(); let has_rand = HasRandTest { rand: Rc::clone(&rand), }; @@ -173,6 +190,8 @@ mod tests { assert_eq!(has_rand.rand_below(1), 0); } + + #[test] fn test_next_pow2() { assert_eq!(next_pow2(0), 0);