簡體   English   中英

不同對象的相同 GetHashCode()

[英]Same GetHashCode() for different objects

執行這段代碼后:

int a = 50;
float b = 50.0f;
Console.WriteLine(a.GetHashCode() == b.GetHashCode());

我們得到False ,這是意料之中的,因為我們正在處理不同的對象,因此我們應該得到不同的哈希值。

但是,如果我們執行此操作:

int a = 0;
float b = 0.0f;
Console.WriteLine(a.GetHashCode() == b.GetHashCode());

我們得到True 兩個對象都返回相同的哈希碼: 0

為什么會發生這種情況? 他們不應該返回不同的哈希值嗎?

System.Int32GetHashCode工作方式如下:

public override int GetHashCode()
{
    return this;
}

這當然是0 ,它將返回0

System.Single的( float是別名) GetHashCode是:

public unsafe override int GetHashCode()
{
    float num = this;
    if (num == 0f)
    {
        return 0;
    }
    return *(int*)(&num);
}

如您所見,在0f它將返回0

使用的程序是ILSpy。

MSDN 文檔

兩個相等的對象返回相等的哈希碼。 然而,反之則不然:相等的散列碼並不意味着對象相等,因為不同(不相等)的對象可以具有相同的散列碼。

概念上相等的對象有義務返回相同的哈希值。 不同的對象沒有義務返回不同的哈希值。 只有當可能存在的對象少於 2^32 個時,這才有可能。 還有更多。 當不同的對象產生相同的散列時,它被稱為“沖突”。 質量散列算法盡可能地減少沖突,但它們永遠無法完全消除。

他們為什么要? 哈希碼是一個有限集; 盡可能多地放入Int32 有許多雙精度數與任何給定的 int 或任何其他給定的雙精度數具有相同的哈希碼。

哈希碼基本上必須遵循兩個簡單的規則:

  1. 如果兩個對象相等,則它們應該具有相同的哈希碼。
  2. 如果一個對象沒有改變其內部狀態,那么哈希碼應該保持不變。

沒有什么要求兩個不相等的對象具有不同的哈希碼; 這在數學上是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM