【问题标题】:Very low cost hash function非常低成本的哈希函数
【发布时间】:2009-01-16 21:53:08
【问题描述】:

我需要一个查找表的散列函数,所以如果我的值是从 0 到 N,我需要一个散列函数给我一个从 0 到 n 的值,即 n

我一直在研究不同的低成本哈希函数,我发现只有这个:

h = z mod n  range(z) - 0 to N, range(h) - 0 to n

我的哈希函数需要在硬件中实现,所以它需要有一个非常低的成本。除了那个简单的事情之外,任何人都可以推荐任何其他公式或算法吗?当我说硬件时,我指的是真正的硬件实现,而不是微处理器中的指令。

谢谢。

更新解决方案

感谢大家的回答,我不会选择最喜欢的,因为根据目标应用程序的特性,它们都同样有效。

【问题讨论】:

标签: hash lookup


【解决方案1】:

它的规范形式是h(x) = (a*x + b) mod n,其中a 和b 是常量,n 是哈希表的大小。您想让n 成为质数,以获得最佳(ish)分布。

请注意,这对某些类型的分布很敏感——例如,仅仅做x mod n 主要依赖于低位的随机性;如果它们在你的集合中不是随机的,你会得到相当大的偏差。

Bob Jenkins 设计了几个非常好的散列函数;这是一个专门设计为易于在硬件中实现的功能: http://burtleburtle.net/bob/hash/nandhash.html

有关许多不同的哈希函数、设计讨论等,请参阅网站的其余部分:http://burtleburtle.net/bob/hash/

【讨论】:

  • 你的意思是不是“......只是做 x mod n 主要是......”?
  • (a*x+b) mod n 中的 b 不会影响任何东西,因为碰撞的东西仍然会,而没有碰撞的东西仍然不会。
【解决方案2】:

CRC?

已经有很多硬件支持了。

【讨论】:

    【解决方案3】:

    鉴于您在 0..N 中的所有数字具有相同的概率,我相信这是解决此问题的最佳哈希值(比取模更快,分布更好):

    h = z * n / N;
    

    所有值都是整数,所以你有一个整数除法。这样,0..N 之间的每个值都映射到 n 中完全相同数量的值。

    例如,当 n=3 和 N=7(值 3 和 7 不包括在范围内)时,哈希是这样的:

    z * n / N = hash
    ----------------
    0 * 3 / 7 = 0
    1 * 3 / 7 = 0
    2 * 3 / 7 = 0
    3 * 3 / 7 = 1
    4 * 3 / 7 = 1
    5 * 3 / 7 = 2
    6 * 3 / 7 = 2
    

    所以每个哈希值的使用频率相同,只是相差 1。请注意 n*(N-1) 不会溢出。

    如果 N 是 2 的幂,则可以通过移位替换除法。例如如果 N=256:

    h = (z * n) >> 8;
    

    【讨论】:

      【解决方案4】:

      以随机顺序重新连接位并采用较低的log2(n) 位

      如果您的数据分布均匀,则只需使用较低的log2(n) 位。

      【讨论】:

        【解决方案5】:

        如果您真正谈论的是硬件(相对于软件,或软件的硬件实现),并且您的哈希桶数 n 可以写为 n = 2m - 1,最简单的是可能是最大长度linear feedback shift register (LFSR),其中 CRC 是一个实例。

        这是一种使用 m 位移位寄存器创建数据包哈希的方法(确保所有数据一致地表示为 K 位字符串,如果字符串较短,则用零填充一端) :

        1. 初始化 LFSR 的状态(CRC-32 使用全 1;全零可能不好)
        2. 移动数据位
        3. (可选)移动额外的 j 个零(j 在 m 和 2m 之间可能是一个不错的选择);这增加了一些额外的散列,以减少输入/输出位之间的直接相关性
        4. 使用 m 位移位寄存器的内容作为散列值。

        【讨论】:

          猜你喜欢
          • 2017-02-20
          • 2021-01-23
          • 1970-01-01
          • 2013-05-05
          • 2014-01-31
          • 2014-06-28
          • 2012-11-19
          • 2021-09-24
          • 2015-07-21
          相关资源
          最近更新 更多