两个整数的伪随机哈希



我需要一个在整个值范围内具有16位或32位伪随机均匀分布数字的NxN矩阵。不幸的是,N非常大(至少为1e6),因此无法预生成它(这将占用大约1 TB的内存)。我能想到的唯一可行的选择是使用索引I和j的散列作为矩阵元素。

有很多整数哈希函数可用,但我不确定哪一个适合,原因有两个。

-只支持32位无符号整数操作。因为N至少是2^20,我不能天真地将两个索引连接成一个32位密钥而不产生不必要的冲突。

-伪随机性在这里很重要,我是而不是构建哈希表。我发现的大多数整数哈希都是为哈希表设计的,没有很强的要求。

一个可能的解决方案是采用像SHA-2这样的加密散列,但性能很重要,而且成本太高。

关于如何将两个32位单元组合成一个同时避免碰撞模式的建议已经有很大帮助,因为我可以从32位到32位的整个范围中选择哈希值。

关于32位到32位哈希具有良好随机性的一些见解也将非常感谢。

预先生成1或2个N个随机数的数组是没有问题的,如果它有帮助的话。

如果它很重要,目标是我在最近版本的GLSL中编写的gpu。

使用LCG如何?众所周知,以……的形式xn = (a*x+c) mod 232a mod 8为3或5且c为奇数时,得到的同余序列周期为232

数值配方:a=1664525, c=1013904223,但有很多

i, j中得到唯一的x,计算xn

我找到了一个合适的算法。计数模式下的分组密码显然是合适的。由于大多数分组密码的性能影响,我最初拒绝了这个想法。然而,我发现了一篇论文,介绍了一种相关的算法(基本上是一个轮数更少的分组密码),名为Philox(并行随机数:如鲑鱼等人的1,2,3一样简单)。

链接:http://www.thesalmons.org/john/random123/papers/random123sc11.pdf

剩下的唯一问题是如何将两个索引组合成一个32位数字。但我猜异或应该足够好,如果与旋转相结合,以避免交换性。

最新更新