如何在 Scala 中获取正确的数组哈希码?

How to get a correct array hashcode in scala?

根据其内容计算数组的 hashCode 的合适方法是什么?

Array.hashCode 用于数组实例:

val h = a.hashCode
println(h == Array(1,2).hashCode) // false

a(0) = 42
println(h == a.hashCode) // true

注意:最好避免在计算 hashCode 之前复制整个数组,例如复制到 List

为什么我问:我在 class 中使用数组(作为私有字段),因为查找时间很关键,并且它的内容与计算 class[= 的 hashCode 相关12=]

来自https://issues.scala-lang.org/browse/SI-1607,它说Array的hashCode是来自java的hashCode,因为scala Array是java Array。而 scala 无法改变它。

但是也说scala在WrappedArray中有一个合适的hashCode方法。 因此:

val a = Array(1,2)
val h = a.toSeq.hashCode // wrapped it in a WrappedArray - no copy
println(h == Array(1,2).toSeq.hashCode) // true

a(0) = 42
println(h == a.toSeq.hashCode) // false

您也可以使用 java.util.Arrays.hashCode(a),它可能比 a.toSeq.hashCode 更快(因为 WrappedArray 似乎继承了一个非数组特定的实现)。

可以直接使用MurmurHash3算法。

import scala.util.hashing.MurmurHash3

MurmurHash3.orderedHash(Array(1,2)))