use rand::RngCore; pub(crate) fn get_rng() -> impl RngCore { XorShiftStar { a: 0x0123_4567_89AB_CDEF, } } /// Simple `Rng` for benchmarking without additional dependencies struct XorShiftStar { a: u64, } impl RngCore for XorShiftStar { fn next_u32(&mut self) -> u32 { self.next_u64() as u32 } fn next_u64(&mut self) -> u64 { // https://en.wikipedia.org/wiki/Xorshift#xorshift* self.a ^= self.a >> 12; self.a ^= self.a << 25; self.a ^= self.a >> 27; self.a.wrapping_mul(0x2545_F491_4F6C_DD1D) } fn fill_bytes(&mut self, dest: &mut [u8]) { for chunk in dest.chunks_mut(8) { let bytes = self.next_u64().to_le_bytes(); let slice = &bytes[..chunk.len()]; chunk.copy_from_slice(slice) } } fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { Ok(self.fill_bytes(dest)) } }