创建哈希代码和溢出

时间:2014-07-01 01:04:57

标签: c# hashcode

我正在尝试从两个整数输入生成哈希码。

中概述的方法

Combining Java hashcodes into a "master" hashcode

似乎适用于许多输入值。但是,当其中一个输入整数为int.MinValue时,行为似乎不太理想。具体来说,我观察

int.MinValue * 1013 == int.MinValue

int.MinValue * 1009 == int.MinValue

int.MinValue * 2 == 0

int.MinValue * 20 == 0

所有这些都在未经检查的上下文中。

我天真(并且错误地)认为int.MinValue * (something other than 1 or 0)会产生与int.MinValue0不同的新位模式。

问题

  1. 为什么int.MinValue乘以这些常数会产生int.MinValue(2个案例)或0(2个案例)?
  2. int.MinValue的行为是否表示哈希算法存在缺陷?

1 个答案:

答案 0 :(得分:2)

乘法更多或更少位向左移位。由于int.MinValue0x80000000(只有一个最高位集),乘法只能产生两个int值 - 0(如果乘以偶数)或者仍然设置最高位的值(对于奇数)。

4位数的样本(x,y,z - 特定位的任何值,1000等同于int.MinValue

1000 * xyz1 =
   (xyz0 * 1000)  + 1000 * 1 = 
   (xyz  * 10000) + 1000 * 1 =  
   (xyz  * 0)     + 1000 = 1000

1000 * xyz0 = 
   (xyz  * 10000) + 1000 * 0 =  0