2010-10-08 78 views

回答

42

根據反射:

public override int GetHashCode() 
{ 
    return this; 
} 

有道理,不是嗎?

+0

我想。我在想所有的價值類型都會有一個共同的實現。 – 2010-10-08 19:43:15

+0

不,每個值類型都有自己的值。 UInt32將自己轉換爲Int32,這只是將自己轉換爲簽名的Int。 Int16和Int64做了一些時髦的位移以產生一個32位值。 System.Boolean根據狀態返回0或1。 – 2010-10-08 19:46:43

+3

Interesing,爲什麼然後'int a = 10;'和'int b = 10.GetHashCode();'提供了不同的x86指令。我們看到這種單行方法將被內聯,所以它應該是相同的,但它不是 – 2017-01-15 14:11:11

-2

將32位值散列爲32位的最佳方法不是發明輪子,而是使用值本身。非常快,沒有碰撞,確實是一個完美的方式。

+3

是的,但這並不一定意味着它是以這種方式實現的。 :) – 2010-10-08 19:47:11

+9

其實這是一個很好的方式來實現它。每MS「爲了獲得最佳性能,散列函數應該爲所有輸入生成一個均勻分佈,包括大量聚集的輸入,這意味着對對象狀態的小修改會導致對最終散列表的大量修改以獲得最佳散列表性能。」 (http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx)此實現儘管簡單會導致錯誤的集羣,並可能導致糟糕的性能,當整數被用作散列表鍵時。 – 2014-05-07 17:21:14

+10

@JeffWalkerCodeRanger通常這是真的。但是大多數哈希表是通過執行'hashCode%bucketLength'來實現的。因此,'0,1,2,3,...'的常見序列將具有完美的散列碼。但是,如果輸入爲'0,32,64,96,128,...',那麼任何冪的二進制存儲桶大小數組<= 32將具有100%散列衝突。如果MS會改變它來進行一些混洗,那麼會有另一個序列會產生100%的混亂衝突。我的觀點是,沒有上下文的Int32,沒有上下文,你不能做一個好的散列函數。如果您需要散列數據,請編寫您自己的散列器。 – Aidiakapi 2015-04-19 14:36:47

相關問題