yadacha/
prng.rs

1use crate::*;
2use hash::new_yadachash;
3use yadacha16k::BufferedRng;
4
5pub struct Yadarng {
6    c: u128,
7    h: hash::Yadachash,
8    i: usize
9}
10// ----------------------------------------------------------------------------
11pub fn new_random_yadarng(rng: &mut dyn SeedRNG) -> Yadarng {
12    let mut brng = BufferedRng::new(rng, 16*1);
13    let mut r = Yadarng{
14        c: brng.take_u128(), h: new_yadachash(), i: 0
15    };
16    r.rehash();
17    r
18}
19// ----------------------------------------------------------------------------
20pub fn new_fixed_yadarng(seed: u128) -> Yadarng {
21    let mut r = Yadarng{
22        c: seed, h: new_yadachash(), i: 0
23    };
24    r.rehash();
25    r
26}
27impl Yadarng {
28    fn rehash(&mut self) {
29        self.h.hash_all(&self.c.to_le_bytes());
30    }
31}
32impl SeedRNG for Yadarng {
33    fn fill(&mut self, buf: &mut [u8]) {
34        for b in buf {
35            *b = self.h.byte_at(self.i);
36            self.i += 1;
37            if self.i == hash::STATE_SIZE {
38                self.c = self.c.wrapping_add(1);
39                self.h = new_yadachash();
40                self.rehash();
41                self.i = 0;
42            }
43        }
44    }
45}