创建哈希码和溢出
本文关键字:溢出 哈希码 创建 | 更新日期: 2023-09-27 18:10:49
我正在尝试从两个整数输入生成哈希码。
中概述的方法将Java哈希码组合成一个"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
的行为是否表明哈希算法存在缺陷?
乘法是向左移动的位。由于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