【发布时间】:2011-12-26 20:28:03
【问题描述】:
我正在寻找一个对大量输入进行分区的哈希函数 对少量分区(比如 100 或 256)。这意味着我预计会有很多碰撞,但我并不关心碰撞。
输入数据事先不知道。我期望有长度的字符串 可能在 6 到 100 个字节之间。字符串可能分布很差 (例如,大部分填充空格或仅包含数字)。
CRC 算法是最先浮现在脑海中的想法之一。 CRC8 已被提议,但未提供有关其的信息 均匀性;对于 CRC32 显然是 uniformity is not that good。
有simple 或general purpose 哈希函数的列表, 但没有说明它们的一致性。
Bob Jenkins 对返回一个 32 位值。我想对于一个均匀分布的 32 位值 所有可能的 8 位子集也应该均匀分布,所以有 是很好的候选人。但也许将 32 位值减少到 如果有更简单的 8 位算法,则为 8 位值?
【问题讨论】:
-
Bernstein 在 Jenkins 页面上的哈希值也不错,而且非常简单。当需要“只是一些哈希”时,我在任何地方都使用它。没有任何问题。如果您担心它不够“随机”,您甚至可以将加法和异或变体组合成一个,这通常会流水线到相同数量的周期。请注意,CRC 的设计原理主要不是产生分布良好的散列,而是检测意外位翻转。
-
使用机器的本机寄存器大小(32 位)进行计算没有任何损失,大多数操作都是在(符号)将操作数扩展到本机 int 大小之后执行的。截断(或取模)会很便宜(但不是免费的)。并非所有哈希函数在最右边的位都有足够的熵。