Java Object.hashCode()是否在多个jvm(同一版本)之间保持一致

Java Object.hashCode()是否在多个jvm(同一版本)之间保持一致,java,hashcode,Java,Hashcode,我被告知Object.hashCode可以返回不同的散列,即使内容相同,例如数组[1,2],并且不能依赖它来验证对象一致性。我的理解是,数组的内容是相同的,那么即使在不同的jvm上,我也会得到相同的哈希值 我问的原因是我想: 散列服务调用返回的数字数组,并将该散列发送到web前端 提交表单时将该散列发送回 再次调用服务对其进行散列,并将其与前端发送的散列进行比较。 我原以为只要做Array.hashCode就可以了,但现在我充满了怀疑 数组不会覆盖哈希代码,这意味着您将获得默认的标识哈希代码。两

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

我问的原因是我想:

散列服务调用返回的数字数组,并将该散列发送到web前端 提交表单时将该散列发送回 再次调用服务对其进行散列,并将其与前端发送的散列进行比较。 我原以为只要做Array.hashCode就可以了,但现在我充满了怀疑

数组不会覆盖哈希代码,这意味着您将获得默认的标识哈希代码。两个相同的数组可能会提供不同的哈希代码,更改数组的内容不会更改其哈希代码

但是,您可以使用静态方法。相关文档说明返回值等于Arrays.asListyourArray.hashCode和。这意味着Arrays.hashCode将在不同JVM上返回一致的哈希代码,只要数组元素在不同JVM上具有一致的哈希代码。

数组不重写哈希代码,这意味着您将获得默认标识哈希代码。两个相同的数组可能会提供不同的哈希代码,更改数组的内容不会更改其哈希代码


但是,您可以使用静态方法。相关文档说明返回值等于Arrays.asListyourArray.hashCode和。这意味着Arrays.hashCode将在不同JVM上返回一致的哈希代码,只要数组的元素在不同JVM上具有一致的哈希代码。

使用一种静态方法array.hashCode而不是对象的hashCode的默认实现(即数组对象使用的实现),它将为您提供所需的内容,因为它根据数组的元素计算哈希代码,因此,以相同顺序包含相同元素的两个数组将生成相同的hashCode。

使用静态方法arrays.hashCode而不是对象的hashCode的默认实现(数组对象使用的实现)将为您提供所需,由于它根据数组的元素计算哈希代码,因此两个数组以相同的顺序包含相同的元素,将生成相同的哈希代码。

否,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
如果需要基于数组内容的哈希代码,请按照Eran和immibis的建议使用Arrays.hashCodearray:

System.out.println(Arrays.hashCode(one));
System.out.println(Arrays.hashCode(two));
印刷品:

994
994
请注意,这与直接在数组上调用hashCode不同。

否,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
如果需要基于数组内容的哈希代码,请按照Eran和immibis的建议使用Arrays.hashCodearray:

System.out.println(Arrays.hashCode(one));
System.out.println(Arrays.hashCode(two));
印刷品:

994
994

请注意,这与直接在数组上调用hashCode不同。

应该会有所帮助。我认为您混淆了常见哈希函数和加密哈希函数。您似乎希望这样做是为了防止用户在应用程序中执行某种攻击。在这种情况下,您不想使用java的哈希方法。您应该使用加密散列函数,如md5或sha。我认为您将常见散列函数与加密散列函数混淆了。您似乎希望这样做是为了防止用户在应用程序中执行某种攻击。在这种情况下,您不想使用java的哈希方法。您应该使用加密哈希函数,如md5或shaThis,它不回答Arrays.hashCode在JVM之间是否一致。这不回答Arrays.hashCode在JVM之间是否一致。