C# Equals and GetHashCode
本文关键字:GetHashCode and Equals | 更新日期: 2023-09-27 18:09:58
几天前我遇到了一个面试问题:为什么两个c#对象或基本类型的未覆盖的GetHashCode()
方法有相同的结果,但Equals()
为false?我被引导到原始类型long
,无法想到一个解决方案。
规则是如果Equals返回true,那么GetHashCode必须返回相同的值,而不是相反。
考虑一下:GetHashCode返回一个int。类型long比类型int有更多可能的值。这意味着多个长值将产生与另一个长值相同的哈希码。这就是所谓的鸽子洞原理:http://en.wikipedia.org/wiki/Pigeonhole_principle
哈希码是一个32位整数-您如何获得每个64位长度的唯一哈希?
为了尽可能高效,哈希码应该尽可能唯一。平等是一个不能被打破的数学规则。
这就是数学。鸽子洞原理指出,如果你有101只鸽子放进100个洞里,那么你将必须在同一个洞里放2只鸽子。
如下所示,如果你有2^64个可能的长度,和2^32个可能的哈希码(signed int),那么你一定会得到不同长度相同的哈希码。
好吧,因为long
是8字节的,int
只有4字节,你可以说会有很多的哈希码冲突。
例如5和4294967300具有相同的哈希码。5.