将数组散列为整数

Hashing an array to an integer

我有一个从 int[2] 数组到权重的映射。所以 [2, 3] -> 5, [4,5] -> 6 等。在我执行 h.put(Arrays.deepHashCode(a), w) 的地方使用 HashMap 是否可行?我有大量数据,我希望能够快速查找给定坐标 x、y 的权重。我看到 h.get(hashcode) 之后似乎 return 给我意想不到的值的错误。不总是,但偶尔。这可能是 [x,y] 和 [a, b] 偶尔可能具有相同的 deepHashCode() 这一事实的产物吗?我会尝试将它归结为一小段代码,但目前很难隔离这个问题。

编辑: 我隔离了这个问题。结果 Arrays.deepHashCode([2, 74]) 与 Arrays.deepHashCode([3, 43]) 相同 [在我的系统上都是 return 1097]。我错误地认为 get() 会为我解决冲突。但它不能,因为它会将哈希码映射到一个值,并且当我执行 put() 时数组键不再存在。

您永远不应该假设哈希码是唯一的。永远记住 return 0hashCode().

的有效实现

你真的应该写一对或一个元组 class 而不是使用数组或手动输入你不应该认为是唯一的哈希码。

在映射中使用数组作为键不是一个好主意,因为它们的 hashCode 实现不是基于它们的内容。您应该使用集合代替数组,或者使用 class 包装数组并正确实现 equalshashCode.