【发布时间】:2011-12-14 17:45:43
【问题描述】:
我正在寻找一个散列函数,它对一个小整数(比如在 0...1000 范围内)进行运算并输出一个 64 位整数。
结果集应该看起来像 64 位整数的随机分布:均匀分布,结果之间没有线性相关性。
我希望有一个只需要几个 CPU 周期来执行的函数。 (代码将使用 C++)。
我考虑将输入乘以一个大素数并取模 2**64(类似于线性全等生成器),但输出之间存在明显的依赖关系(在低位中)。
谷歌搜索没有显示任何内容,但我可能使用了错误的搜索词。
有这样的功能吗?
一些背景信息:
我想避免在算法中使用带有伪随机数的大型持久表,并即时计算看起来随机的数字。
安全不是问题。
【问题讨论】:
-
你见过这个吗? stackoverflow.com/questions/5085915/…这两个答案都很有趣!
-
@kol,我之前错过了这个,它看起来确实很有趣。我明天会评论。
-
如果您的数字介于 0 和 1000 之间,则预先计算的表不会“很大” - 它会消耗大约 8k 的内存。它也是最快的算法。这真的是个问题吗?
-
8k 可能是很多内存(至少很多缓存;如果查找未命中缓存,则 MurmurHash3 终结器在当前商品硬件上更快),但听起来好像 OP 正在做Zobrist 哈希,所以我也不买它。
-
@per 我更笼统地提出了这个问题,但我确实在尝试实现 Zobrist 散列。我认为这个问题会有更多用途,所以我很惊讶你发现了这一点。我的灵感来自 Linus Torvalds 的一篇关于查找表的帖子:lookup-tables。所以,我想试一试。