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

Version Path
wasmtime-30.0.2 ./ext/cargo-vendor/wasi-common-30.0.2/src/random.rs
wasmtime-29.0.0 ./ext/cargo-vendor/wasi-common-29.0.0/src/random.rs
wasmtime-28.0.0 ./ext/cargo-vendor/wasi-common-28.0.0/src/random.rs
wasmtime-27.0.0 ./ext/cargo-vendor/wasi-common-27.0.0/src/random.rs
wasmtime-26.0.0 ./ext/cargo-vendor/wasi-common-26.0.0/src/random.rs
wasmtime-25.0.2 ./ext/cargo-vendor/wasi-common-25.0.2/src/random.rs
wasmtime-25.0.1 ./ext/cargo-vendor/wasi-common-25.0.1/src/random.rs
wasmtime-25.0.0 ./ext/cargo-vendor/wasi-common-25.0.0/src/random.rs
wasmtime-24.0.0 ./ext/cargo-vendor/wasi-common-24.0.0/src/random.rs
wasmtime-23.0.2 ./ext/cargo-vendor/wasi-common-23.0.2/src/random.rs
wasmtime-22.0.0 ./ext/cargo-vendor/wasi-common-22.0.0/src/random.rs
wasmtime-21.0.1 ./ext/cargo-vendor/wasi-common-21.0.1/src/random.rs
wasmtime-20.0.2 ./ext/cargo-vendor/wasi-common-20.0.2/src/random.rs
wasmtime-20.0.0 ./ext/cargo-vendor/wasi-common-20.0.0/src/random.rs
wasmtime-18.0.3 ./ext/cargo-vendor/wasi-common-18.0.3/src/random.rs
wasmtime-17.0.1 ./ext/cargo-vendor/wasi-common-17.0.1/src/random.rs
wasmtime-17.0.0 ./ext/cargo-vendor/wasi-common-17.0.0/src/random.rs
wasmtime-16.0.0 ./ext/cargo-vendor/wasi-common-16.0.0/src/random.rs
wasmtime-15.0.1 ./ext/cargo-vendor/wasi-common-15.0.1/src/random.rs
wasmtime-15.0.0 ./ext/cargo-vendor/wasi-common-15.0.0/src/random.rs