2013-02-03 110 views
0

知道這不是很聰明地使用HashCode作爲一個唯一的標識符,GetHashCode的衝突

但假設我有相同的hashCode兩個變量是我可以讓他們的唯一途徑,

我怎麼能說出不同?

+0

你可以發佈代碼嗎?我不太確定「在同一個HashCode上是什麼意思是我能得到它們的唯一方式」。 –

+0

我沒有代碼,它是一個普遍的問題。 –

回答

1

你應該能夠確定引用是等價的。

嘗試使用ReferenceEquals函數檢查是否有對同一對象的引用。

+0

但是'Equals'用於測試這兩個對象是否「喜歡」。即使有兩個對象,情況也是如此。例如'string x =「abc」;字符串y =「a」; y + =「bc」;',代碼運行後,'x'和'y'具有相同的散列碼。 'Equals'返回'true',因爲'x'和'y'具有相同的字符串值。但'ReferenceEquals'返回'false',因爲'x'和'y'指的是兩個對象,不是同一個(不重要的是兩個對象實際上是相同的)。 –

+0

@JeppeStigNielsen你是對的。但是,我相信提問者試圖確定他是否提及同一個對象,而不是如果變量的值相等。 – Mash

+1

如果她(@HodayaShalom)真的只對對象平等感興趣,而不是使用'x.GetHashCode()',她可以說'RuntimeHelpers.GetHashCode(x)'。即使「x」和「y」是兩個「等於」wrt的對象實例,它將(以極高的概率)給出唯一的代碼。 'Equals'。另一方面,重寫的實例方法'GetHashCode()'(無參數)必須爲'x'和'y'提供一個共同的哈希。 –

1

這在文檔中有很多介紹。假設你只有散列碼:

GetHashCode方法的默認實現不是 保證了不同對象的唯一返回值。此外,.NET Framework不保證 GetHashCode方法的默認實現,並且它返回的值將在 不同版本的.NET Framework之間相同。因此,不得將此方法的默認實現用作散列目的的唯一對象 標識符。

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

+0

我讀過它,但讓我們說這樣的事情發生了,我無法改變它,沒有辦法知道兩個變量之間的差異? –

+1

假設你有舊的哈希碼,不。你可以檢查對象引用是否相等,但你的問題似乎暗示你所知道的是散列碼。 –