.Net GetHashcode位移操作

D. *_*ick 12 .net hashcode bit-shift

我昨天查看了一些.net源代码,看到了GetHashcode的几个实现,其中包含以下内容:

(i1 << 5) + i ^ i2
Run Code Online (Sandbox Code Playgroud)

我理解代码在做什么以及为什么.我想知道的是为什么他们使用(i1 << 5)+ i代替(i1 << 5)- i.

我见过的大多数框架都使用-i,因为它相当于乘以31这是素数,但是微软的方式相当于乘以33,它有11和3作为因子,因此不是素数.

这有什么理由吗?有任何合理的假设吗?

D. *_*ick 3

我在 math.stackexchange.com 上问了同样的问题:33 的好奇属性

数学家的猜想和我对此主题所做的研究使我相信答案是这样的:

好的,我知道为什么 Microsoft 使用 33。这就是所谓的 Bernstein 哈希。事实证明,33 具有一些神奇的特性,可以产生良好的哈希码分布,但关于其原因的理论知识却很少。

基本上,在熵和速度比较方面,伯恩斯坦做得足够好,而且相当敏捷。提出常数 33 的丹·伯恩斯坦 (Dan Bernstein) 无法解释 33 的什么属性产生了如此好的哈希分布。

已经写了几篇比较散列函数的论文,并证实了这一发现,但没有进一步解释使用 33 的好处。此外,我找不到为什么 Java 使用 31。迄今为止,这似乎是一个数学和编程之谜。