Object.hashCode() 将在多个 jvm(相同版本)之间保持一致
will Object.hashCode() be consistent across multiple jvm's (same version)
有人告诉我 Object.hashCode() 可以 return 不同的散列,即使内容相同,例如数组 [1,2] 并且不能依赖它验证对象一致性。我的理解是我的数组的内容是相同的,那么即使在不同的 jvm 上,我也会得到相同的散列?
我问的原因是我想:
- 通过服务调用 return 对数字数组进行哈希处理,并将该哈希值发送到 Web 前端
- 在提交表单时发回该散列
- 再次调用该服务对其进行哈希处理,并将其与前端发送的哈希进行比较。
我以为简单地做 Array.hashCode() 就可以完成这项工作,但我现在充满了疑问!
数组不会覆盖 hashCode
,这意味着您将获得默认值 "identity hash code"。两个相同的数组(可能)会给你不同的哈希码,改变数组的内容不会改变它的哈希码。
但是,您可以使用静态方法Arrays.hashCode(yourArray)
. The documentation for this says that the return value is equal to Arrays.asList(yourArray).hashCode()
, and all lists are guaranteed to use the same hash algorithm。也就是说Arrays.hashCode
会return在不同JVM上的哈希码一致,只要数组的元素在不同JVM上哈希码一致即可。
使用其中一种静态方法 Arrays.hashCode
而不是 Object
的 hashCode
的默认实现(这是数组对象使用的实现)将为您提供所需的东西,因为它根据数组的元素计算哈希码,所以包含相同顺序的相同元素的两个数组将产生相同的哈希码。
不,java.lang.Object.hashCode()
不会总是 return 跨多个 JVM 的相同值;更糟糕的是,当您停止并再次启动 JVM 时,对 Object.hashCode()
的调用可能 return 与之前的 运行.
不同的值
请注意,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.hashCode(array)
:
System.out.println(Arrays.hashCode(one));
System.out.println(Arrays.hashCode(two));
打印:
994
994
请注意 Arrays.hashCode()
与直接在数组上调用 hashCode()
不同。
有人告诉我 Object.hashCode() 可以 return 不同的散列,即使内容相同,例如数组 [1,2] 并且不能依赖它验证对象一致性。我的理解是我的数组的内容是相同的,那么即使在不同的 jvm 上,我也会得到相同的散列?
我问的原因是我想:
- 通过服务调用 return 对数字数组进行哈希处理,并将该哈希值发送到 Web 前端
- 在提交表单时发回该散列
- 再次调用该服务对其进行哈希处理,并将其与前端发送的哈希进行比较。
我以为简单地做 Array.hashCode() 就可以完成这项工作,但我现在充满了疑问!
数组不会覆盖 hashCode
,这意味着您将获得默认值 "identity hash code"。两个相同的数组(可能)会给你不同的哈希码,改变数组的内容不会改变它的哈希码。
但是,您可以使用静态方法Arrays.hashCode(yourArray)
. The documentation for this says that the return value is equal to Arrays.asList(yourArray).hashCode()
, and all lists are guaranteed to use the same hash algorithm。也就是说Arrays.hashCode
会return在不同JVM上的哈希码一致,只要数组的元素在不同JVM上哈希码一致即可。
使用其中一种静态方法 Arrays.hashCode
而不是 Object
的 hashCode
的默认实现(这是数组对象使用的实现)将为您提供所需的东西,因为它根据数组的元素计算哈希码,所以包含相同顺序的相同元素的两个数组将产生相同的哈希码。
不,java.lang.Object.hashCode()
不会总是 return 跨多个 JVM 的相同值;更糟糕的是,当您停止并再次启动 JVM 时,对 Object.hashCode()
的调用可能 return 与之前的 运行.
请注意,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.hashCode(array)
:
System.out.println(Arrays.hashCode(one));
System.out.println(Arrays.hashCode(two));
打印:
994
994
请注意 Arrays.hashCode()
与直接在数组上调用 hashCode()
不同。