java - Java Arrays.hashCode 的碰撞强度

标签 java arrays hash

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/

相关文章:

javascript - backbone.js 中的多个主题标签路由

java - 在同一个 Tomcat 服务器上部署 JSF 1.2 和 JSF 2.0 应用程序

Java 正则表达式 : split comma-separated values but ignore commas in quotes

javascript - 如何将数组转换为数组中的对象 - Angular 和 Javascript

javascript - 我想显示名称和 ID 的 Json 数组

JavaScript - 检查多个 SELECT 是否有重复选项

ruby - 为什么我们可以在 block 中使用数组索引来在ruby中进行哈希排序?

hash - 是否可以为整个整数范围实现通用哈希?

java - 在 Java 中缺少从 bool 到 integer 的自动转换

java - 如何在没有Hadoop的情况下运行Apache Crunch应用程序?