计算取决于其内容的数组的 hashCode 的合适方法是什么?
Array.hashCode
用于数组实例:
val h = a.hashCode
println(h == Array(1,2).hashCode) // false
a(0) = 42
println(h == a.hashCode) // true
注意:在计算 hashCode 之前,最好避免复制整个数组,例如复制到 List
我为什么问:我在类中使用数组(作为私有字段),因为查找时间很关键,并且其内容与计算类的 hashCode 相关
来自 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)))
使用 Arrays.deepHashCode(Object[] a)。在 scala 中你应该使用丑陋的:
java.util.Arrays.deepHashCode(array.asInstanceOf[Array[Object]])
此方法也适用于多维数组