2011-08-10 6 views
12

私はこの線に沿って何かをGetHashCodeメソッドのいくつかの実装を.NETソース昨日のいくつかを見ていると見ました:ネットGetHashCodeメソッドビットシフト動作

(i1 << 5) + i^i2 

が、私はコードがやって、なぜされているものを理解します。私が知りたいのは、(i1 < < 5)+ iの代わりに(i1 < < 5)-を使用した理由です。

私が見たほとんどのフレームワークは-iを使用しています。なぜならそれは素数である31で乗算するのと同じだからですが、マイクロソフトの方法は11と3を要素とする33を掛けることと等価です。

正当な理由がありますか?合理的な仮説?

+1

Microsoftが33を使用する理由を知りました。これはBernstein Hashと呼ばれています。 33には、ハッシュコードの良い分布を生成するいくつかの魔法の性質があり、なぜか、理論的な知識はほとんどないことが分かります。 –

答えて

3

私はmath.stackexchange.com:Curious Properties of 33で同じ質問をしました。数学と話題に私がやった研究の答えがこれですと信じて私をリード間

推測:

オーケーMicrosoftはバーンスタイン ハッシュと呼ばれる33を使用して、なぜ、私が見つけました。 33には、 のハッシュコードの良い分布が生成されるいくつかの魔法の性質があり、なぜそれほど理論的にはほとんど理論的なものがないことがわかります。

基本的に、エントロピーとスピードの比較では、バーンスタインは十分にうまくいっており、非常にうまくいきます。定数33を思いついたダン・バーンスタイン(Dan Bernstein)は、このようなハッシュの良い分布を作り出した33の性質を説明することができませんでした。

ハッシュ関数を比較した論文がいくつか書かれており、33の利点をさらに説明せずにこの発見を裏付けました。さらに、Javaが31を代わりに使用する理由を見つけることができませんでした。これまでの数学的およびプログラミング的ミステリーのように見えます。

0

31がこれらの素数の1つであるかどうかはわかりませんが、Dictionary<K,V>によって容量として使用される特定の素数があります。また、左のフィールドを使用しても、選択したバケットには影響がなくなり、ハッシュが縮退します。

+0

31バケットカウント(System.Collections.HashHelpers.primesを見てください)の素数リストには含まれていませんが、それは最初の質問ではありませんでした。私の質問は、マイクロソフトが31の代わりに33を掛けたのはなぜですか?私が見た他のフレームワークは31倍になります.33はプライムでもありません。 –

+0

31がそのリストに現れた場合、それはMSが31を乗数として使用しない理由を説明します。しかし、プライムであることは、とにかくそれほど重要ではありません。 – CodesInChaos

関連する問題