在执行这段代码之后:
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
。
这一切为什么要发生?他们不是应该返回不同的哈希吗?
发布于 2014-10-28 09:57:16
GetHashCode
of System.Int32
的工作方式如下:
public override int GetHashCode()
{
return this;
}
当然,如果这是0
,它将返回0
。
System.Single
's (float
是别名) GetHashCode
是:
public unsafe override int GetHashCode()
{
float num = this;
if (num == 0f)
{
return 0;
}
return *(int*)(&num);
}
正如您所看到的,在0f
,它将返回0
。
使用的程序是ILSpy。
发布于 2014-10-28 09:57:41
来自MSDN文档
两个相等的对象返回相等的哈希码。然而,相反的情况并非如此:相等的哈希码并不意味着对象相等,因为不同的(不平等)对象可以具有相同的哈希码。
发布于 2014-10-28 09:56:57
概念上相等的对象有义务返回相同的散列。不同的对象是,而不是,它们有义务返回不同的散列。只有在可能存在的对象少于2^32的情况下,才有可能这样做。还有更多的。当不同的对象产生相同的散列时,它被称为“冲突”。高质量的哈希算法最大限度地减少了冲突,但它们永远无法被完全删除。
https://stackoverflow.com/questions/26615134
复制相似问题