创建哈希码和溢出

本文关键字:溢出 哈希码 创建 | 更新日期: 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.MinValue0不同的新位模式。

问题
  1. 为什么int.MinValue乘以这些常数会得到int.MinValue(2例)或0(2例)?
  2. int.MinValue的行为是否表明哈希算法存在缺陷?

创建哈希码和溢出

乘法是向左移动的位。由于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