【问题标题】:Array Hash algorithm better than Arrays.deepHashCode in JavaArray Hash 算法优于 Java 中的 Arrays.deepHashCode
【发布时间】:2014-04-20 07:58:49
【问题描述】:

感觉默认Java Arrays.deepHashCode的算法有问题:

我尝试了以下代码:

Integer[] a1 = { 2, 1 };
Integer[] a2 = { 1, 32 };
System.out.println("deepHash a1:" + Arrays.deepHashCode(a1) + " a2:" + Arrays.deepHashCode(a2));

输出是:

deepHash a1:1024 a2:1024

我在我的应用程序中发现,当双元素数组的第一个元素很小(例如 1 或 2)时,Arrays.deepHashCode 会产生很多冲突。

有谁知道更好的数组哈希算法?我的意思是通常比 Arrays.deepHashCode 更好。

数组可以包含任何类型的元素。整数、字符串、双精度、布尔值等......不仅是整数。数组可以有任意数量的元素。我需要一个函数来替换 Arrays.deepHashCode(Object[]),采用相同类型的参数 (Object[]) 并给出相同类型的输出 (int)。

【问题讨论】:

  • 整数数组?您可以使用任何散列算法,例如 MurmurHash3
  • hash = primeNumber * hash + currentElement.hashCode();
  • 这个哈希结果被用作HashMap中的key。它必须是一个整数。所以我不能使用像 SHA 这样的高级 Hash 算法。
  • 这个数组可以有任何类型的元素。 integer、String、Double、boolean 等......不仅是 Integer。
  • hoaz:求素数模数和随机性,否则太容易坏了:)

标签: java arrays algorithm hash


【解决方案1】:

一个临时的解决方案是将数组加倍然后散列。

Integer[] a1 = { 2, 1, 2, 1 };
Integer[] a2 = { 1, 32, 1,32 };

不会引起冲突。您可以使用 System.arraycopy() 自动进行复制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多