2016-11-18 35 views
3

什麼是根據其內容計算數組的哈希碼的合適方法?如何在scala中獲得正確的數組哈希碼?

Array.hashCode對於數組實例:

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

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

注意:最好能夠避免複製整個陣列,以例如列表,計算的hashCode

爲什麼我問之前:我在一個類中使用一個數組(因爲查詢時間很關鍵),並且它的內容與計算類的hashCode相關

回答

4

來自https://issues.scala-lang.org/browse/SI-1607,它表示Array的hashCode是hashCode java,a s的scala數組是java Array。而斯卡拉無法改變它。

但它也表示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 
4

您還可以使用java.util.Arrays.hashCode(a),很可能會比a.toSeq.hashCode快(因爲WrappedArray似乎繼承一個非數組具體實施)。

+0

它適用於Array [Int],但我不知道它如何處理其他(通用)項目類型。我想我們需要在更一般的情況下將對象轉換爲對象,或者使用其他一些Java函數(?)。最後,我更喜歡依靠scala API。但是我可能有些缺點,我不知道(效率?)。 –

+0

WrappedArray可能有一點開銷:它需要一個簡單的類構造(包裝數組),並且每次查找都需要額外的函數調用。但就我的經驗來看,直接查找很難看出差異。我試過並沒有管理 –

+1

我已提出拉取請求以確保這不再是一個問題,並已通過https://github.com/scala/scala/pull/5551。 –

0

您可以直接使用MurmurHash3算法。

import scala.util.hashing.MurmurHash3 

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