【问题标题】:djb2 Hash Functiondjb2 哈希函数
【发布时间】:2011-02-04 00:39:51
【问题描述】:

我正在使用 djb2 算法为字符串生成哈希键,如下所示

hash(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}

现在每个循环都有两个大数的乘法,在字符串的第 5 个字符的第 4 个字符经过一段时间后,随着哈希值变得很大,溢出

什么是正确的重构方法,使哈希值不会溢出并且哈希也正确发生

【问题讨论】:

  • 没有DJB2 hash这种东西,只有标准的DJB,然后是Salsa20等。
  • cse.yorku.ca/~oz/hash.html 指的是 DJB2,如果没有得到正式认可,我相信这个术语被广泛使用。

标签: hash string-hashing


【解决方案1】:

哈希计算经常溢出。这通常根本不是问题,只要您能保证当它确实溢出时会发生什么。不要忘记散列的意义不是有一个数字,它在大小等方面意味着什么——它只是一种检测相等性的方法。为什么溢出会干扰呢?

【讨论】:

  • 更准确地说:与 33 的乘法(移位和加法)预计会溢出。 c的添加也是如此。这是规范的一部分,可以这么说。
【解决方案2】:

你不应该那样做。由于没有模数,整数溢出是该函数的预期行为(并且在设计时考虑到了这一点)。你为什么要改变它?

【讨论】:

    【解决方案3】:

    我认为您使用静态/运行时分析器来警告整数溢出?好吧,这是您可以忽略警告的情况之一。哈希函数是为特定类型的属性设计的,所以不用担心分析器的警告。只是不要尝试自己创建哈希函数!

    【讨论】:

      【解决方案4】:

      返回(哈希和 0xFFFFFFFF); // 或者任何你想要的掩码,只要你保持一致都没关系。

      【讨论】:

        猜你喜欢
        • 2015-05-17
        • 2018-08-04
        • 2021-10-05
        • 2016-03-25
        • 2011-02-27
        • 2011-08-04
        • 2011-07-10
        • 2022-01-03
        • 2019-07-24
        相关资源
        最近更新 更多