将Object.hashCode()在多个jvm中保持一致(相同版本)

时间:2015-07-09 06:54:40

标签: java hashcode

我被告知Object.hashCode()可以返回不同的哈希,即使内容相同,例如数组[1,2],并且不能依赖它来验证对象的一致性。我的理解是我的Array的内容是相同的然后我会得到相同的哈希回来,即使在不同的jvm?

我问的原因是我想:

  • 散列服务调用返回的数字数组,并将该散列发送到Web前端
  • 在提交表单
  • 时发回该哈希值
  • 再次对服务进行调用哈希,并将其与前端发送的哈希进行比较。

我认为只是做Array.hashCode()就可以完成这项工作,但我现在充满怀疑!

3 个答案:

答案 0 :(得分:3)

数组不会覆盖hashCode,这意味着您将获得默认的"身份哈希码"。两个相同的数组将(可能)为您提供不同的哈希码,并且更改数组的内容不会更改其哈希码。

但是,您可以使用静态方法Arrays.hashCode(yourArray)。相关文档说明返回值等于Arrays.asList(yourArray).hashCode()all lists are guaranteed to use the same hash algorithm。这意味着Arrays.hashCode 在不同的JVM上返回一致的哈希码,只要数组的元素在不同的JVM上具有一致的哈希码。

答案 1 :(得分:2)

使用其中一个静态方法Arrays.hashCode而不是Object的默认实现hashCode(这是数组对象使用的实现)会给你什么需要,因为它根据数组的元素计算哈希码,所以两个包含相同顺序的相同元素的数组会产生相同的hashCode。

答案 2 :(得分:2)

不,java.lang.Object.hashCode()并不总是在多个JVM中返回相同的值;更糟糕的是,当您再次停止并启动JVM时,对Object.hashCode()的调用可能会返回与上一次运行不同的值。

请注意,Object.hashCode() 会根据对象的内容自动计算哈希码。因此对于具有相同内容的两个数组,哈希码很可能是不同的:

int[] one = new int[]{1,2};
int[] two = new int[]{1,2};

System.out.println(one.hashCode());
System.out.println(two.hashCode());

打印出来(例如;当你运行它时,你很可能得到不同的数字):

1725154839
1670675563

使用Arrays.hashCode(array)作为Eran和immibis建议您是否需要基于数组内容的哈希码:

System.out.println(Arrays.hashCode(one));
System.out.println(Arrays.hashCode(two));

打印:

994
994

请注意,Arrays.hashCode()与直接调用数组上的hashCode()不同。