一尘不染

寻找一个哈希函数/ Ordered Int /到/ Shuffled Int /

algorithm

我在寻找恒定时间算法,可以将有序整数索引值更改为随机哈希索引。如果它是可逆的,那将很好。我需要每个索引唯一的哈希键。我知道这可以通过在大文件中查找表来完成。IE会创建一个有序的所有int集合,然后将它们随机洗牌并以随机顺序写入文件。然后,您可以根据需要阅读它们。但这需要搜索大文件。我想知道是否有一种简单的方法可以使用伪随机生成器根据需要创建序列?

生成使用PRNG,而不是洗牌洗牌范围的答案被
erikkallen线性反馈移位寄存器貌似正确类的事情。我只是尝试过,但是会产生重复和破洞。

问候大卫·艾伦·芬奇


阅读 251

收藏
2020-07-28

共1个答案

一尘不染

现在的问题是,您是否需要一个真正随机的映射,或者只是一个“弱”排列。假设使用后者,如果您对2的补码算术使用无符号的32位整数(例如)进行运算,则乘以任何奇数是双射且可逆的映射。当然,XOR也是如此,因此您可以尝试使用的简单模式例如

unsigned int hash(int x) {
   return (((x ^ 0xf7f7f7f7) * 0x8364abf7) ^ 0xf00bf00b) * 0xf81bc437;
}

数字没有什么神奇的。因此您可以更改它们,甚至可以将它们随机化。唯一的事情是被乘数必须是奇数。而且,您必须使用滚动计算(忽略溢出)。这可以颠倒。要进行反演,您需要能够计算正确的互补被乘数A和B,之后进行反演。

unsigned int rhash(int h) {
    return (((x * B) ^ 0xf00bf00b) * A) ^ 0xf7f7f7f7;
}

您可以用数学方法计算A和B,但对您来说更简单的事情是运行循环并搜索它们(即,一旦脱机)。

该方程式将XOR与乘法混合在一起以使映射成为非线性。

2020-07-28