Minor tweaks to Owen scrambling functions.

This commit is contained in:
Nathan Vegdahl 2022-07-25 15:43:07 -07:00
parent ef489c1ca2
commit 98a9aeb374

View File

@ -6,12 +6,11 @@ pub fn owen2(n: u32, seed: u32) -> u32 {
// This is to ensure that the seed doesn't behave poorly with // This is to ensure that the seed doesn't behave poorly with
// e.g. incrementing parameters, and also that zero doesn't // e.g. incrementing parameters, and also that zero doesn't
// map to zero in the hash function. // map to zero in the hash function.
let seed = seed.wrapping_mul(0xe8559dcb) ^ 0x372fcdb9; let seed = seed.wrapping_mul(0x68318d2f) ^ 0x5adbc2a7;
let mut result = n; let mut result = n;
for i in 0..32 { for i in 0..32 {
let mask = (!0 << 1) << i; // Two shifts to avoid undefined overflow. result ^= hash((n & (!1 << i)) ^ seed) & (1 << i);
result ^= hash((n & mask) ^ seed) & (1 << i);
} }
result result
@ -55,7 +54,7 @@ pub fn owen4(n: u32, seed: u32) -> u32 {
let mut result = 0; let mut result = 0;
for i in 0..16 { for i in 0..16 {
let mask = (!0 << 2) << (i * 2); // Two shifts to avoid undefined overflow. let mask = !0b11 << (i * 2);
let perm_entry = PERMUTATION_TABLE[ let perm_entry = PERMUTATION_TABLE[
// The xor with `i` is to ensure runs of zeros in `n` still // The xor with `i` is to ensure runs of zeros in `n` still
// result in different shuffles on each iteration. `i` is // result in different shuffles on each iteration. `i` is