![](/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.