2014-11-03 59 views
0

不同的对象相同数量比方说,我有这种情况长的hashCode返回在Java

Long id = -1L; 
    System.out.println(id.hashCode()); 

    id = 0L; 
    System.out.println(id.hashCode()); 

你猜怎么着?两个输出都给出相同的数字(0)!我的问题是:

  1. 为什么会发生这种情况?
  2. 我怎样才能省略这个并计算适当的散列0和-1?

预先感谢答复:)

+2

你似乎认为散列总是唯一的。他们不是。有2^64个长,2^32个可用的哈希码......显然会有碰撞。你绝不应该假定具有相同散列码的两个值是相等的。他们只是*可能*是平等的。 – 2014-11-03 11:35:50

+0

那么,我知道可能会发生一些碰撞,但我认为这将发生在大数目而不是最近的数字。 – 2014-11-03 11:39:14

+0

显然这是一个危险的假设...如果你编写你的代码不要假设它可以把散列码当作平等的终极仲裁者,那么它就没有关系。 – 2014-11-03 11:42:43

回答

5

这究竟是为什么?

由于Long.hashCode实现是as follows

结果是独家通过此Long对象持有的原始长值的两个部分的异或。也就是说,哈希码就是表达式的值:

(int)(this.longValue()^(this.longValue()>>>32)) 

我怎么能忽略这一点,并计算适当的哈希值0和-1?

这些适当的哈希值。哈希不保证是唯一的;实际上,如果存在超过2个可能的输入值,则保证而不是是唯一的。

如果你想要一个不同的行为,你需要写一个MyInteger类,行为不同(尽管我怀疑没有真正的理由这样做)。

0

根据散列函数,2个不同的对象可以有相同的散列码。

Javadoc

hashCode的一般合同是:

每当它是一个Java应用程序的执行期间,在同一对象不止一次上调用,hashCode方法必须始终 返回相同的整数,没有提供信息用于等于 对对象进行比较修改。该整数不必保持 从应用程序的一次执行到同一应用程序的另一次执行 的一致。 如果两个对象根据equals(Object)方法相等,则对两个对象中的每个对象调用hashCode方法必须产生相同的整数结果。 根据equals(java.lang.Object)方法,如果两个对象不相等,则不要求在两个对象的每一个上调用hashCode方法 必须生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同的 整数结果可能会提高散列表的性能。

尽可能合理实用,由 类Object定义的hashCode方法确实为不同的对象返回不同的整数。 (这 通常是通过转换 对象的内部地址转换成一个整数来实现的,但是这种实现技术不是由的JavaTM编程语言不需要 。)