.NET(C#):GetHashCode不需要太複雜!

來源:互聯網
上載者:User

今兒看到兩位同學在討論GetHashCode方法的執行,貌似他們的對象等同性判斷挺複雜的,而又想把同樣的邏輯寫在GetHashCode中,然後激烈的討論著用什麼演算法讓GetHashCode返回的整數更具唯一性。

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

還有人錯誤的認為字典的儲存是完全靠GetHashCode的結果,顯然這是不對的,GetHashCode僅返回一個int怎能勝任所有結果呢?

 

來看這個例子,這樣一個類,他的GetHashCode返回整數資料的餘2的結果。(僅為做樣本,很顯然這個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

可以看到,當GetHashCode可以直接分辨出不相等時,Equals就沒必要調用了,而當GetHashCode返回相同結果時,Equals方法會被調用從而確保判斷對象是否真的相等。所以,還是那句話:GetHashCode沒必要一定把對象分辨得很清楚(況且它也不可能,一個int不可能代表所有的可能出現的值),有Equals在後面做保障。GetHashCode僅需要對對象進行快速判斷。

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.