【问题标题】:finding a hash function for long integer array查找长整数数组的哈希函数
【发布时间】:2014-11-26 12:01:32
【问题描述】:

我正在寻找一个整数数组的散列函数,每个数组包含大约 17 个整数。 HashMap 中有大约 1000 个项目,我希望计算尽可能快。

我现在对这么多可供选择的哈希函数感到有些困惑,我注意到它们中的大多数都是为具有不同字符的字符串而设计的。那么有没有专为只有数字的字符串设计的散列函数呢?

感谢您的耐心等待!

【问题讨论】:

  • 你的意思是hashmap里面的hashmap?还是接受字符串作为键和整数作为值的哈希图?
  • 抱歉,描述不明确。其实我只是想在哈希图中按键查询一个对象。并且 hashmap 接受一个整数数组作为键。
  • 您想要一个 int 数组作为 Map 中的键似乎很奇怪。

标签: java hash hashcode hash-function


【解决方案1】:

您没有指定任何要求(计算速度除外),但请查看java.util.Arrays#hashCode。它也应该很快,只需在数组上迭代一次并在 int 计算中组合元素。

根据指定数组的内容返回一个哈希码。对于任意两个非空 int 数组 a 和 b 使得 Arrays.equals(a, b),Arrays.hashCode(a) == Arrays.hashCode(b) 也是如此。

此方法返回的值与通过在包含以相同顺序表示 a 元素的 Integer 实例序列的 List 上调用 hashCode 方法获得的值相同。如果 a 为 null,则此方法返回 0。


hashmap 接受一个整数数组作为键。

其实没有!

从技术上讲,您可以在 Java 中使用 int[] 作为 HashMap 中的键(您可以使用任何类型的 Object),但这不会很好,因为数组没有定义有用的 @987654327 @ 方法(或有用的equals 方法)。所以密钥将使用对象标识。两个内容相同的数组会被认为是不同的。

您可以使用List<Integer>,它实现了hashCodeequals。但请记住,在将列表设置为键后,您不得对其进行变异。这会破坏哈希表。

【讨论】:

  • 谢谢~我看过他们,我只是想了解更多关于哈希码的计算。基本上,我希望尽可能少的哈希码冲突。由于少于 1000 个项目,我认为它应该几乎不会产生冲突。而且我还希望计算速度快,因为它会在很长一段时间内实现。再次感谢您的努力~
  • 哈希码的计算定义在docs.oracle.com/javase/6/docs/api/java/util/…。很简单,只要加上和乘以 31。
  • 我想知道在这种情况下使用它是否足够?有没有更好的解决方案?我见过一些散列函数,例如 FNV 散列和 ELF 散列。似乎它们也很好实施。
  • 您可以使用数据样本运行测试。看看它是否“行为”。
  • 好的~由于我对哈希函数不太熟悉,所以你能推荐一些为整数数组设计的哈希,除了通过乘以31种东西定义的哈希吗?
【解决方案2】:

hashmap 函数可以在 https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

创建一个 hashmap 很容易.. 它是这样的

HashMap<Object, Integer> map = new HashMap<Object, Integer>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多