我正在尝试从两个整数输入生成哈希码。
中概述的方法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.MinValue
或0
不同的新位模式。
问题
int.MinValue
乘以这些常数会产生int.MinValue
(2个案例)或0
(2个案例)?int.MinValue
的行为是否表示哈希算法存在缺陷?答案 0 :(得分:2)
乘法更多或更少位向左移位。由于int.MinValue
是0x80000000
(只有一个最高位集),乘法只能产生两个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