与不同对象相同的GetHashCode()

时间:2014-10-28 17:51:59

标签: c# .net hashcode

执行这段代码后:

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

为什么会这样?他们不应该回归不同的哈希吗?

4 个答案:

答案 0 :(得分:4)

来自MSDN Documentation

  

两个相等的对象返回相等的哈希码。然而,   相反的情况并非如此:相等的哈希码并不意味着对象   相等,因为不同(不相等)的对象可以具有相同的哈希值   码。

答案 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相同的哈希码。

哈希码基本上必须遵循两个简单的规则:

  1. 如果两个对象相等,则它们应具有相同的哈希码。
  2. 如果对象没有改变其内部状态,那么哈希码应该保持不变。
  3. 没有任何东西要求两个不相等的对象具有不同的哈希码;这在数学上是不可能的。