【问题标题】:Pseudorandom hash of two integers两个整数的伪随机散列
【发布时间】: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 个哈希值,你当然会遇到冲突。

标签: random hash glsl gpgpu


【解决方案1】:

使用 LCG 怎么样?众所周知的事实是,形式为 xn = (a*x+c) mod 232 其中a mod 8 为 3 或 5,c 为奇数,所得同余序列的周期为 232 .

数字配方:a=1664525, c=1013904223,但数量很多

i, j 形成唯一的x,并计算xn

【讨论】:

  • 依赖于先前元素的序列不适合这里。
  • @MaVo159 ?!你写了Pseudorandomness is important here。任何伪随机 RNG 都将依赖于前一个元素。你的哈希函数会有这样的依赖
  • 不,任何伪随机 rng 都取决于状态,但您的解决方案取决于先前的结果,这使得它不适合这种情况。在这种情况下,状态是输入,这就是哈希的工作方式。大多数 rng 中的状态与之前的结果不同。
  • @MaVo159 对于 LCG,x 是一个状态(也是之前的结果)。但是在您的情况下,状态/先前的结果将是i,j 的某些功能(例如i*N+j),它如何使它不合适? In this case the state is the input 绝对适用于 LCG,这样称呼它 M[i][j] = LCG(f(i,j))。 Wrt State is not the same as previous result in most rngs 好吧,这是真的,但我看不到相关性
  • @MaVo159 让我们考虑一些具有以下要求的通用 RNG。 1) 状态是无符号 32 位 2) 周期是 232。这意味着这样的 RNG 实际上几乎只是散列函数的另一个名称,它唯一地将 11 个输入 32 位映射到输出 32 位。所以现在的任务是从i,j 中创建唯一状态,因此输出将是不同的伪随机 32 位,可以用作该索引处的矩阵值。 LCG 是满足条件 1 和 2 的最简单的一种。如果您不喜欢 LCG,您可能会查看 xorshift32(包括 + 或 * 变体)、MWC、SWC 或 ...
【解决方案2】:

我找到了一个合适的算法。计数器模式中的分组密码显然是合适的。由于大多数分组密码的性能影响,我最初拒绝了这个想法。但是,我发现一篇论文介绍了一种名为 Philox(Parallel Random Numbers: As Easy as 1, 2, 3 by Salmon et al.)的相关算法(基本上是轮数较少的分组密码)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2018-11-06
    • 2011-09-22
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多