Sha256: a7d4bb5649223a868f4d2d3072c0d36cf6f8d3ec25420267505488374dc8a775
Contents?: true
Size: 1.5 KB
Versions: 39
Compression:
Stored size: 1.5 KB
Contents
use cap_rand::RngCore; /// Implement `WasiRandom` using a deterministic cycle of bytes. pub struct Deterministic { cycle: std::iter::Cycle<std::vec::IntoIter<u8>>, } impl Deterministic { pub fn new(bytes: Vec<u8>) -> Self { Deterministic { cycle: bytes.into_iter().cycle(), } } } impl RngCore for Deterministic { fn next_u32(&mut self) -> u32 { let b0 = self.cycle.next().expect("infinite sequence"); let b1 = self.cycle.next().expect("infinite sequence"); let b2 = self.cycle.next().expect("infinite sequence"); let b3 = self.cycle.next().expect("infinite sequence"); ((b0 as u32) << 24) + ((b1 as u32) << 16) + ((b2 as u32) << 8) + (b3 as u32) } fn next_u64(&mut self) -> u64 { let w0 = self.next_u32(); let w1 = self.next_u32(); ((w0 as u64) << 32) + (w1 as u64) } fn fill_bytes(&mut self, buf: &mut [u8]) { for b in buf.iter_mut() { *b = self.cycle.next().expect("infinite sequence"); } } fn try_fill_bytes(&mut self, buf: &mut [u8]) -> Result<(), cap_rand::Error> { self.fill_bytes(buf); Ok(()) } } #[cfg(test)] mod test { use super::*; #[test] fn deterministic() { let mut det = Deterministic::new(vec![1, 2, 3, 4]); let mut buf = vec![0; 1024]; det.try_fill_bytes(&mut buf).expect("get randomness"); for (ix, b) in buf.iter().enumerate() { assert_eq!(*b, (ix % 4) as u8 + 1) } } }
Version data entries
39 entries across 39 versions & 1 rubygems