首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >djb2哈希函数

djb2哈希函数
EN

Stack Overflow用户
提问于 2010-04-03 23:32:42
回答 4查看 22.8K关注 0票数 7

我使用djb2算法为一个字符串生成散列键,如下所示

代码语言:javascript
复制
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个字符出现溢出,因为散列值变得很大

什么是重构的正确方法,这样散列值就不会溢出,并且散列也会正确地发生

EN

回答 4

Stack Overflow用户

发布于 2010-04-03 23:38:01

散列计算经常溢出。这通常根本不是问题,只要你能保证当它溢出时会发生什么。别忘了,hash的意义不在于有一个数字,而是一个数字--它只是检测相等性的一种方式。为什么溢出会影响到它呢?

票数 20
EN

Stack Overflow用户

发布于 2010-04-03 23:39:00

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

票数 4
EN

Stack Overflow用户

发布于 2010-04-04 00:29:42

我在考虑使用静态/运行时分析器来警告整数溢出?这是一种你可以忽略警告的情况。哈希函数是为特定类型的属性设计的,因此不必担心来自分析器的警告。只是不要试图自己创建哈希函数!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2571683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档