【问题标题】:Arrays.deepHashCode() is not uniqueArrays.deepHashCode() 不是唯一的
【发布时间】:2018-06-20 18:25:34
【问题描述】:

为什么Arrays.deepHashCode() 不是唯一的?如何生成数组的唯一哈希?

int[][] array1 = { { 8, 7, 4 }, { 3, 6, 5 }, { 0, 2, 1 } };
int[][] array2 = { { 8, 4, 0 }, { 6, 7, 5 }, { 3, 2, 1 } };

System.out.println("Hash array1 " + Arrays.deepHashCode(array1));
System.out.println("Hash array2 " + Arrays.deepHashCode(array2));

?!

Hash array1 37308160
Hash array2 37308160

【问题讨论】:

  • "为什么Arrays.deepHashCode() 不是唯一的?" - 为什么应该这样?附带说明一下,您将多个ints 映射到一个int,因此不能保证它是唯一的。
  • 哈希码不能保证是唯一的,事实上由于pigeonhole principle,它不能是唯一的。换句话说:没有唯一的哈希码,你想要的也是不可能的。
  • 您可以相当轻松地编写自己的深度哈希码方法,该方法更有可能为两个大小相等但不同的二维小数数组生成不同的哈希码。

标签: java arrays hash


【解决方案1】:

这不会破坏任何 Java 契约。 Hashcode 应该尽可能频繁地为不同的对象返回不同的整数,但这不是必需的。

hashCode的通用合约是:

只要在 Java 应用程序执行期间对同一个对象多次调用它,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上相等比较中使用的信息。该整数不需要在应用程序的一次执行与同一应用程序的另一次执行之间保持一致。

  • 如果两个对象根据 equals(Object) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。
  • 不要求如果根据equals(java.lang.Object) 方法两个对象不相等,则对两个对象中的每一个调用hashCode 方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

【讨论】:

    【解决方案2】:

    java.util.Arrays.deepHashCode(Object[]) 方法根据指定数组的“深层内容”返回一个哈希码。对于任意两个数组 a 和 b 使得Arrays.deepEquals(a, b)Arrays.deepHashCode(a) == Arrays.deepHashCode(b) 也是如此。

    根据 javadoc:

    public static int deepHashCode(Object[] a)
    

    根据指定的“深层内容”返回一个哈希码 大批。如果数组包含其他数组作为元素,则哈希码 是基于它们的内容等等,无穷无尽。因此是 在包含自身的数组上调用此方法是不可接受的 一个元素,直接或间接通过一个或多个级别 的数组。这种调用的行为是未定义的。对于任何 两个数组 a 和 b 这样Arrays.deepEquals(a, b),它也是 Arrays.deepHashCode(a) == Arrays.deepHashCode(b).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      相关资源
      最近更新 更多