【问题标题】:Hash functions with good uniformity for unknown input对未知输入具有良好一致性的哈希函数
【发布时间】:2011-12-26 20:28:03
【问题描述】:

我正在寻找一个对大量输入进行分区的哈希函数 对少量分区(比如 100 或 256)。这意味着我预计会有很多碰撞,但我并不关心碰撞。

输入数据事先不知道。我期望有长度的字符串 可能在 6 到 100 个字节之间。字符串可能分布很差 (例如,大部分填充空格或仅包含数字)。

CRC 算法是最先浮现在脑海中的想法之一。 CRC8 已被提议,但未提供有关其的信息 均匀性;对于 CRC32 显然是 uniformity is not that good

simplegeneral purpose 哈希函数的列表, 但没有说明它们的一致性。

Bob Jenkins 对返回一个 32 位值。我想对于一个均匀分布的 32 位值 所有可能的 8 位子集也应该均匀分布,所以有 是很好的候选人。但也许将 32 位值减少到 如果有更简单的 8 位算法,则为 8 位值?

【问题讨论】:

  • Bernstein 在 Jenkins 页面上的哈希值也不错,而且非常简单。当需要“只是一些哈希”时,我在任何地方都使用它。没有任何问题。如果您担心它不够“随机”,您甚至可以将加法和异或变体组合成一个,这通常会流水线到相同数量的周期。请注意,CRC 的设计原理主要不是产生分布良好的散列,而是检测意外位翻转。
  • 使用机器的本机寄存器大小(32 位)进行计算没有任何损失,大多数操作都是在(符号)将操作数扩展到本机 int 大小之后执行的。截断(或取模)会很便宜(但不是免费的)。并非所有哈希函数在最右边的位都有足够的熵。

标签: hash uniform


【解决方案1】:

我发现 sdbm 算法的一致性很好,非常简单:

        h := 0.
        forEach ch in str {
            h := (h * 65599) + ch;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2012-09-27
    • 1970-01-01
    • 2010-10-12
    • 2010-11-22
    • 2017-11-15
    • 2011-10-27
    相关资源
    最近更新 更多