C#Equals和GetHashCode

时间:2014-06-23 09:10:36

标签: c#

我几天前遇到过一个面试问题:2个C#对象或原始类型对于未被覆盖的GetHashCode()方法有什么相同的结果,但Equals()为假?我被引导到原始类型long,并且无法想到解决方案。

4 个答案:

答案 0 :(得分:8)

规则是如果Equals返回true,则GetHashCode必须返回相同的值,但不是相反。

考虑一下:GetHashCode返回一个int。 Type long具有比Type int更多的可能值。这意味着多个long值将产生与另一个long值相同的哈希码。这被称为鸽子洞原则: http://en.wikipedia.org/wiki/Pigeonhole_principle

答案 1 :(得分:4)

哈希码是一个32位整数 - 你如何获得每64位长的唯一哈希?

为了尽可能高效,哈希码应该尽可能唯一。平等是一个不能被打破的数学规则。

答案 2 :(得分:4)

这是数学。 pigeonhole principle指出,如果你有101只鸽子投入100个洞,那么必须将2只鸽子放入同一个洞。

如下所示,如果您有2 ^ 64个可能的长度和2 ^ 32个可能的哈希码(signed int),那么您必须获得不同长度的相同哈希码。

答案 3 :(得分:2)

好吧,由于long是8-by而int只有4,你可以说会有 A LOT 的哈希码冲突。

例如, 5 4294967300 具有相同的哈希码。这是5。