为何int.MinValue与int.MaxValue哈希码不等,Int64的却相等?
int与Int64的MinValue/MaxValue哈希码差异原因
32位int的情况
int的GetHashCode()实现逻辑很直接:直接返回整数自身的值。int.MinValue是-2147483648,int.MaxValue是2147483647,这两个值本身就不相等,所以它们的哈希码自然也不相等,int.MinValue.GetHashCode() == int.MaxValue.GetHashCode()结果为false。
64位Int64的情况
Int64的GetHashCode()实现是将64位值的低32位与高32位做异或运算(核心逻辑为(int)_value ^ (int)(_value >> 32)),最终返回一个32位哈希值。- 我们分别计算两者的哈希码:
- Int64.MinValue:值为
-9223372036854775808,二进制是最高位为1,其余63位全0。转成int取低32位结果为0;将值右移32位后取高32位转int结果为-2147483648。异或计算:0 ^ (-2147483648) = -2147483648。 - Int64.MaxValue:值为
9223372036854775807,二进制是最高位为0,其余63位全1。转成int取低32位结果为-1(32位全1的有符号整数);将值右移32位后取高32位转int结果为2147483647。异或计算:-1 ^ 2147483647 = -2147483648。
- Int64.MinValue:值为
- 两者的哈希码结果都是
-2147483648,所以Int64.MinValue.GetHashCode() == Int64.MaxValue.GetHashCode()结果为true。
补充说明
哈希码的设计目标是尽可能让不同对象产生不同哈希值,但哈希冲突(不同值对应相同哈希码)无法完全避免——因为64位整数的取值范围远大于32位哈希值的范围,必然存在不同64位值对应同一32位哈希码的情况,Int64.MinValue和Int64.MaxValue就是典型的冲突案例。
内容的提问来源于stack exchange,提问作者Leonid Umanskiy
相关产品推荐
相关产品推荐

