Arrays.hashCode
方法中使用的哈希机制防止冲突的强度有多强?两个不同的数组(例如,double
)使用这些方法计算出精确的哈希值的可能性有多大?
最佳答案
Arrays.hashCode(double[])
指定返回包含表示相同数值的 Double
值的 List
的等效值。
List.hashCode
依次用一个相当简单的算法指定:
int hashCode = 1;
for (E e : list)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
一般来说,与素数相乘对于通用哈希函数来说是一个很好的做法,但它距离加密强哈希函数还很远。
这意味着虽然在一般(实际上是随机的)情况下不太可能发生冲突,但如果您可以影响(或选择)hashCode
,则通常可以很容易地构建它们列表中的项目。
作为一个构建的示例,请考虑以下两个语句:
System.out.println(Arrays.hashCode(new double[] {4.753E-321d}));
System.out.println(Arrays.hashCode(new double[] {4.9E-324d, 4.9E-324d}));
尽管数组明显不同,但它们都将输出 993。
关于java - Java Arrays.hashCode 的碰撞强度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57784989/