C# 不同对象的GetHashCode()相同

C# 不同对象的GetHashCode()相同,c#,.net,hashcode,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。两个

执行这段代码后:

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
。两个OBEJCT返回相同的哈希代码:
0


为什么会发生这种情况?它们不应该返回不同的散列吗?

概念上相等的对象有义务返回相同的散列。不同的对象没有义务返回不同的哈希值。只有当可能存在的对象少于2^32个时,这才有可能。不止这些。当不同的对象产生相同的散列时,称为“冲突”。高质量散列算法尽可能减少冲突,但它们永远无法完全删除。

概念上相等的对象必须返回相同的散列。不同的对象没有义务返回不同的哈希值。只有当可能存在的对象少于2^32个时,这才有可能。不止这些。当不同的对象产生相同的散列时,称为“冲突”。高质量的哈希算法尽可能减少冲突,但它们永远无法完全删除。
系统的
GetHashCode
。Int32
的工作原理如下:

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。

系统的
GetHashCode
。Int32的工作原理如下:

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。

来自:

两个相等的对象返回相等的哈希代码。然而, 反之亦然:相等的哈希代码并不意味着对象 相等,因为不同(不相等)对象可以具有相同的哈希 代码

发件人:

两个相等的对象返回相等的哈希代码。然而, 反之亦然:相等的哈希代码并不意味着对象 相等,因为不同(不相等)对象可以具有相同的哈希 代码


他们为什么要这样做?散列码是一个有限集;在
Int32
中尽可能多地安装。有许多double将具有与任何给定int或任何其他给定double相同的哈希代码

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

  • 如果两个对象相等,则它们应该具有相同的哈希代码
  • 如果一个对象没有改变其内部状态,那么哈希代码应该保持不变

  • 不强制两个不相等的对象使用不同的哈希代码;这在数学上是不可能的。

    他们为什么要这样做?散列码是一个有限集;在
    Int32
    中尽可能多地安装。有许多double将具有与任何给定int或任何其他给定double相同的哈希代码

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

  • 如果两个对象相等,则它们应该具有相同的哈希代码
  • 如果一个对象没有改变其内部状态,那么哈希代码应该保持不变

  • 不强制两个不相等的对象使用不同的哈希代码;这在数学上是不可能的。

    不一定-它们只是整数。看看这里:如果我们检查等式
    a.Equals(b)
    ,我们得到
    False
    ,即使它们的散列是相同的,它们是将项目分组在一起的一种方法,不验证唯一性。您的误解是不同或不相等的对象应该具有不同的哈希代码。散列码的唯一要求是相等的对象具有相同的散列码。不一定-它们只是整数。请看这里:如果我们检查相等
    a.Equals(b)
    ,我们会得到
    False
    ,即使它们的散列是相同的,它们也是将项目分组在一起的一种方法,不验证唯一性。您的误解是不同或不相等的对象应该具有不同的哈希代码。散列码的唯一要求是相等的对象具有相同的散列码。我想这可以解释一切:)我想这可以解释一切:)我不知道这个事实!你的第一句话应该是“概念上相等的对象有义务返回相同的哈希值”吗?我不知道这个事实!你的第一句话不应该是“概念上相等的对象有义务返回相同的哈希值”吗?