散列和归约到桶算法

Hash and reduce to bucket algorithm

问题

我们有一组符号序列,应该映射到预定义数量的桶索引。

先决条件

符号序列长度有限制(64位characters/bytes),使用的哈希算法是Bob Jenkins hash的Delphi实现的32位哈希值。

为了进一步将这些哈希值分布到一定数量的桶中,我们使用公式:

问题

一位同事有一些疑问,我们需要为 num_buckets 选择一个质数,以实现最优的 1 分布,将符号序列映射到 bucket_numbers.

团队的大多数人认为这是一个未经证实的假设,尽管我们的队友只是声称这是数学上固有的(没有更深入的解释)。

我可以想象,我们使用的某些符号序列模式(这只是实际允许的非常有限的子集)可能更喜欢某些 hashvalues,但通常我不认为这对于大量符号序列来说真的很重要。
哈希算法应该已经最优地分配 hashvalues,我怀疑素数 mod 除数是否真的会产生显着差异(无法衡量经验上的),特别是因为 Bob Jenkins 哈希演算也不涉及任何素数,据我所知。

[TL;DR]
素数 mod 除数对这种情况是否重要?


1) 最佳只是意味着每个桶的序列数的平均值稳定,不会随序列总数变化(太多)

你的同事完全错了。

如果哈希运行良好,则所有哈希值的可能性应该相同,并且其关系从输入数据中看不出来。

当您使用散列 mod 某个值时,您就将同样可能的散列输入映射到数量减少的输出桶。结果现在分布不均匀,以至于不同数量的投入可以产生产出。只要桶的数量相对于散列值的范围较小,这种差异就很小。它的顺序是# of buckets / # of hash values。由于桶的数量通常低于 10^6,而哈希值的数量超过 10^19,因此这确实非常小。但是如果桶的个数除以hash值的范围,就没有出入了。

除了当桶的数量除以散列函数的范围时获得最佳分布这一点外,素数不会进入它。由于散列函数的范围通常是 2 的幂,因此质数的桶不太可能为您做任何事情。