【发布时间】:2014-07-01 01:04:57
【问题描述】:
我正在尝试从两个整数输入生成哈希码。
中概述的方法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的行为是否表明哈希算法存在缺陷?
【问题讨论】:
-
它可能表明那个散列算法存在缺陷,但并非所有散列算法都仅通过乘法来实现。事实上,看看 .NET 通常是如何做的,将一个素数相加并与另一个素数相乘。添加可能表明此“缺陷”的修复。
-
@LasseV.Karlsen:与其他替代方案相比,这种创建哈希的方法似乎被认为是有缺陷的。旋转哈希似乎是更合适的选择eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx