【发布时间】:2015-10-22 16:58:13
【问题描述】:
我需要一个 NxN 矩阵,它在整个值范围内具有 16 位或 32 位伪随机均匀分布的数字。不幸的是,N 非常大(至少 1e6),所以它不能被预先生成(这需要大约 TB 的内存)。我能想到的唯一可行的选择是使用索引 i 和 j 的哈希作为矩阵元素。
有很多整数哈希函数可用,但我不确定哪些适合,原因有两个。
-只有 32 位无符号整数运算可用。由于 N 至少为 2^20,我不能天真地将两个索引连接到一个 32 位密钥中而不会造成不必要的冲突。
-伪随机性在这里很重要,我不是构建哈希表。我发现的大多数整数哈希都是为哈希表设计的,没有非常严格的要求。
一种可能的解决方案是采用像 SHA-2 这样的加密哈希,但性能很重要,而且成本太高。
关于如何将两个 32 位单元组合成一个以避免冲突模式的建议已经很有帮助,因为我可以从 32 位到 32 位哈希的整个范围中进行选择。
对于 32 位到 32 位散列具有良好随机性的一些见解也将不胜感激。
如果有帮助的话,预生成 1 或 2 个包含 N 个随机数的数组是没有问题的。
如果重要的话,目标是我在最新版本的 GLSL 中编写的 GPU。
【问题讨论】:
-
如果没有准确了解您的需求,很难做出推荐。在过去的 20 年中,我在类似的应用程序中使用 Robert Jenkins' hash function 取得了不错的效果。它具有非常好的雪崩特性。我会说这值得一试。
-
完全雪崩、均匀和无图案是我的主要要求。
-
在这种情况下,一定要试试 Jenkins 哈希函数。作者已将代码放在公共域中,因此您应该可以将其用于几乎任何类型的代码库。在我的记忆中,另一个具有良好雪崩效果的哈希是 Murmur3 哈希。
-
有点明显,但是如果你有 2^40 个元素并且只有 2^32 甚至只有 2^16 个哈希值,你当然会遇到冲突。