昨天,我在浏览一些.net源代码,并看到了GetHashcode的一些实现,其实现方式与此类似:(i1 << 5) + i ^ i2我了解代码在做什么以及为什么。我想知道的是为什么他们使用(i1 + i而不是(i1 - i。我见过的大多数框架都使用-i,因为它等效于乘以31,这是质数,但是Microsoft的方式等效于乘以33,它具有11和3作为因数,因此不是质数。是否有已知的理由?有合理的假设吗? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 我在math.stackexchange.com上问了同样的问题:Curious Properties of 33。我对数学家的猜想和我对该主题所做的研究使我相信答案是这样的: Okay, I found out why Microsoft uses 33. That's called the Bernstein Hash. It turns out that 33 has some magical properties that produce a good distribution of hash codes and there's very little theoretical knowledge as to why.基本上,在熵和速度的比较中,伯恩斯坦做得很好,而且很活泼。提出常数33的人丹·伯恩斯坦(Dan Bernstein)无法解释33的哪些属性产生如此良好的散列分布。已经有几篇论文比较了散列函数,并在没有进一步说明使用33的好处的情况下证实了这一发现。此外,我找不到Java为什么改为使用31的原因。迄今为止,这似乎是一个数学和编程上的谜。 (adsbygoogle = window.adsbygoogle || []).push({});
10-06 14:18
查看更多