不同对象使用相同的 GetHashCode()

Mat*_*ero 1 .net c# hashcode

执行这段代码后:

int a = 50;
float b = 50.0f;
Console.WriteLine(a.GetHashCode() == b.GetHashCode());
Run Code Online (Sandbox Code Playgroud)

我们得到False,这是预期的,因为我们正在处理不同的对象,因此我们应该得到不同的哈希值。

但是,如果我们执行以下命令:

int a = 0;
float b = 0.0f;
Console.WriteLine(a.GetHashCode() == b.GetHashCode());
Run Code Online (Sandbox Code Playgroud)

我们得到True. 两个对象返回相同的哈希码:0

为什么会出现这种情况?他们不应该返回不同的哈希值吗?

Kug*_*uBu 5

GetHashCode作品System.Int32如下:

public override int GetHashCode()
{
    return this;
}
Run Code Online (Sandbox Code Playgroud)

当然,有了这个存在0,它就会回归0

System.Single的(float是别名)GetHashCode是:

public unsafe override int GetHashCode()
{
    float num = this;
    if (num == 0f)
    {
        return 0;
    }
    return *(int*)(&num);
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,0f它会返回0

使用的程序是ILSpy。