在this例子中,海報已經重寫了get hash編碼方法。我知道這樣做是爲了爲返回的對象提供更好的散列值,以減少衝突次數,並因此減少需要調用Equals()
的次數。C#重寫GetHashCode方法
我想知道什麼,是這個算法是如何計算出來的:
return 17 + 31 * CurrentState.GetHashCode() + 31 * Command.GetHashCode();
是否存在有問題的數字是選擇了一個特別的原因?我可以簡單地選擇自己的號碼投入嗎?
在this例子中,海報已經重寫了get hash編碼方法。我知道這樣做是爲了爲返回的對象提供更好的散列值,以減少衝突次數,並因此減少需要調用Equals()
的次數。C#重寫GetHashCode方法
我想知道什麼,是這個算法是如何計算出來的:
return 17 + 31 * CurrentState.GetHashCode() + 31 * Command.GetHashCode();
是否存在有問題的數字是選擇了一個特別的原因?我可以簡單地選擇自己的號碼投入嗎?
一般你應該選擇素數。這可以幫助您避免爲不同的輸入參數獲取相同的散列值。
素數通常用於哈希碼計算以最小化衝突。如果您搜索哈希碼和素數在這個ISTE,你會發現一些這方面的詳細說明(請注意,它是具體的注語):
您通常希望使用素數(如上所述),因爲它減少了碰撞的可能性(兩個實例產生相同的結果)。有關更多信息,請參閱:http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/
僅供參考,MS C#編譯器(用於匿名類型)使用種子「-1134271262」和乘數「-1521134295」。只是說' – 2011-05-31 10:48:22
@MarcGravell:你有這個來源嗎? – DeepSpace101 2014-06-25 03:01:02
@ DeepSpace101 ILDASM; p – 2014-06-25 06:50:50