2012-05-27 29 views
1

我在C#的哈希映射中使用了這個函數,像類「Dictionary」。有三個Int16值的C#GetHashCode?

x,y和z是Int16。

public override int GetHashCode() 
{ 
    return (x << 16) | (UInt16)y; 
} 

我怎麼能擴展到使用所有3個變量?


與任意數量的任何類型的變量,甚至在更一般的情況見What is the best algorithm for an overridden System.Object.GetHashCode?

+2

請,請不要使用接受的答案。在上面的重複問題中使用答案!接受的問題是無止境的(傾向於0,傾向於0xffff ...,不同對象的散列相同,散列不平衡等)。 – Oliver

+0

對於Int32中的三個Int16不可避免的不同的對象不具有相同的代碼? – alan2here

回答

1

對於三個變量X,Y,任何類型的Z,標準方法如下:

return x.GetHashCode()^y.GetHashCode()^z.GetHashCode(); 

^是XOR運算符。

您也可以使用XOR運算符將其他變量合併到您的方法中。

+0

標準? [引用要求] –

+2

我將其稱爲「標準」,因爲它在[MSDN文章](http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx)中明確提及方法。 – GregRos

+0

請注意[1,2,3],[2,1,3],[3,2,1]在這裏都有相同的散列。 –