2019-08-06 00:03:51 +00:00
|
|
|
/// Simple non-cryptographic diffusion function.
|
|
|
|
pub fn diffuse(mut x: u32) -> u32 {
|
2019-08-06 07:55:43 +00:00
|
|
|
x = x.wrapping_add(0x7ed55d16).wrapping_add(x << 12);
|
|
|
|
x = (x ^ 0xc761c23c) ^ (x >> 19);
|
|
|
|
x = x.wrapping_add(0x165667b1).wrapping_add(x << 5);
|
|
|
|
x = x.wrapping_add(0xd3a2646c) ^ (x << 9);
|
|
|
|
x = x.wrapping_add(0xfd7046c5).wrapping_add(x << 3);
|
|
|
|
x = (x ^ 0xb55a4f09) ^ (x >> 16);
|
|
|
|
x
|
2019-08-05 16:46:28 +00:00
|
|
|
}
|
|
|
|
|
2019-08-06 00:03:51 +00:00
|
|
|
/// Expand a 32 bit seed into a 32 byte RNG state.
|
|
|
|
pub fn rng_state(mut x: u32) -> [u8; 32] {
|
|
|
|
let mut r: [u32; 8] = [0; 8];
|
|
|
|
for s in &mut r {
|
|
|
|
x = diffuse(x);
|
|
|
|
*s = x;
|
2019-08-05 16:46:28 +00:00
|
|
|
}
|
|
|
|
unsafe { std::mem::transmute(r) }
|
|
|
|
}
|