首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >元组GetHashCode黑客

元组GetHashCode黑客
EN

Stack Overflow用户
提问于 2016-03-15 07:46:08
回答 3查看 2K关注 0票数 4

了解到要获得两个对象的哈希码,通常对它们各自的哈希码执行异或操作,我想检查Tuple如何处理Item1 == Item2的情况。这就是我在源代码中发现的:

代码语言:javascript
复制
internal static int CombineHashCodes(int h1, int h2) {
        return (((h1 << 5) + h1) ^ h2);
    }

我认为这是为了避免对所有相同的对象使用相同的哈希码,因为x ^ x = 0。为什么是h1 << 5?为什么它是专门的5呢?难道只有1吗?请帮我理解一下。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-15 08:16:10

((h1 << 5) + h1)等同于h1 * 33333 * 11

Java在某些散列中使用31,因为它是素数,而h1 * 31是几乎相同的(h1 << 5) - h,但是在求和时没有额外的溢出。

票数 5
EN

Stack Overflow用户

发布于 2016-03-15 08:12:28

在这里发现了一些东西这里

阅读关于Shift-Add-XOR散列的一节。

票数 1
EN

Stack Overflow用户

发布于 2016-04-10 18:48:45

感谢@HansPassant向我指出以下问题,这最能解释我想知道的事情:

为什么5381和33在djb2算法中如此重要?

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

https://stackoverflow.com/questions/36005243

复制
相关文章

相似问题

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