GetHashCode作用


除了以下的轉載,再補充幾點:

1、相同對象的hashcode一定相同,不同的hashcode不一定不相同。

2、好的散列算法可以更均勻的分布,進而可以更快的索引

3、據說,值對象的hashcode由第一個字段得來

4、hashtable,dictionary等相關的類需要借助hash值來判斷KEY(只是輔助作用,為了更快,最終還是要靠equals來判斷),原理上,只有immutable的對象才可以作為KEY,否則,將有可能永遠找不到某個VALUE了。

以下轉載

我覺得簡而言之GetHashCode的作用就是:盡量用最快的時間對對象進行初步判斷。當然這里時間的快慢和判斷的深度沒有具體要求,只要沒有走極端就可以(比如太費時間,或者判斷深度太淺)。因此沒必要吧GetHashCode搞得太復雜!

class a
{
    public int Id { get; private set; }
    public a(int i)
    {
        Id = i;
    }

    public override bool Equals(object obj)
    {
        Console.WriteLine("Equals");
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }

        return Id == ((a)obj).Id;
    }

        //返回余2的結果
    public override int GetHashCode()
    {
        Console.WriteLine("GetHashCode");
        return Id % 2;
    }
}

 

 

var o1 = new a(1); //GetHashCode返回1
var o2 = new a(2); //GetHashCode返回0
var o3 = new a(3); //GetHashCode返回1

var dic = new Dictionary<a, object>();
dic.Add(o1, 123);
Console.WriteLine("分隔符");
Console.WriteLine(dic.ContainsKey(o2));
Console.WriteLine("分隔符");
Console.WriteLine(dic.ContainsKey(o3));

 

 

GetHashCode
分隔符
GetHashCode
False
分隔符
GetHashCode
Equals
False

 

最后你可能有些疑惑為什么不直接用Equals非得搞個GetHashCode在前面先判斷一下?這個是由於Equals方法必須把兩個對象搞清楚是等於 還是不等於,所以可能效率不是最優的(況且Object.Equals通常包含類型的轉換,這個可以參考IEquatable或 IEqualityComparer,他們支持泛型),而GetHashCode不需要絕對弄清楚是否相等所以可以優化下效率。舉個最簡單的例子,比較兩 個人是不是完全一樣(一樣的話代表是他的克隆人),Equals會一個細胞接一個細胞得比較,而GetHashCode可以通過判斷性別,長相,聲音…… 快速得進行判斷。所以先用GetHashCode會很快的判斷出許多不同的人,當然如果GetHashCode返回True(遇到了雙胞胎或者克隆人), 再用Equals進行徹底的比較。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM