执行这段代码后:
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
。两个obejcts都返回相同的哈希码:0
。
为什么会这样?他们不应该回归不同的哈希吗?
答案 0 :(得分:4)
两个相等的对象返回相等的哈希码。然而, 相反的情况并非如此:相等的哈希码并不意味着对象 相等,因为不同(不相等)的对象可以具有相同的哈希值 码。
答案 1 :(得分:3)
GetHashCode
的{{1}}的作用类似于:
System.Int32
当然这是public override int GetHashCode()
{
return this;
}
,它将返回0
。
0
' s(System.Single
是别名)float
是:
GetHashCode
如您所见,在public unsafe override int GetHashCode()
{
float num = this;
if (num == 0f)
{
return 0;
}
return *(int*)(&num);
}
,它会返回0f
。
使用的程序是ILSpy。
答案 2 :(得分:1)
概念上相同的对象有义务返回相同的哈希值。不同的对象不有义务返回不同的哈希值。只有当可能存在的对象少于2 ^ 32时才能实现这一点。还有更多。当不同的对象导致相同的散列时,它被称为“碰撞”。质量哈希算法尽可能地减少冲突,但永远不能完全删除它们。
答案 3 :(得分:0)
他们为什么要这样?哈希码是一个有限集;尽可能多的Int32
。有许多双打将具有与任何给定的int或任何其他给定的double相同的哈希码。
哈希码基本上必须遵循两个简单的规则:
没有任何东西要求两个不相等的对象具有不同的哈希码;这在数学上是不可能的。