![](/img/trans.png)
[英]Can object.GetHashCode() produce different results for the same objects (strings) on different machines?
[英]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.Int32
的GetHashCode
工作方式如下:
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 或任何其他給定的雙精度數具有相同的哈希碼。
哈希碼基本上必須遵循兩個簡單的規則:
沒有什么要求兩個不相等的對象具有不同的哈希碼; 這在數學上是不可能的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.