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

问题描述 投票:0回答:4

计算取决于其内容的数组的 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 相关

arrays scala hashcode
4个回答
5
投票

来自 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

5
投票

您还可以使用

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


4
投票

您可以直接使用MurmurHash3算法。

import scala.util.hashing.MurmurHash3

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

0
投票

使用 Arrays.deepHashCode(Object[] a)。在 scala 中你应该使用丑陋的:

java.util.Arrays.deepHashCode(array.asInstanceOf[Array[Object]])

此方法也适用于多维数组

© www.soinside.com 2019 - 2024. All rights reserved.