Scala设置哈希码

时间:2011-10-12 06:34:06

标签: scala hashcode

假设我们在Scala中有三组字符串。一个有元素A,B,C。两个具有元素B,C,D。三个有元素J,K,I。

我的第一个问题是,是否有任何方法可以使这两组中的任何两个的哈希码相同? 我的第二个问题是,如果我将D添加到One和A到Two以获得新的Set One.n和Two.n,那么One.n和Two.n的哈希码是否相同?

2 个答案:

答案 0 :(得分:6)

问题1)总的来说是的,完全可能。哈希码的长度有限。套装可以是任何尺寸。所以哈希码不能是唯一的(尽管通常都是)。

问题2)为什么不试试呢?

scala> val One = collection.mutable.Set[String]("A", "B", "C")
One: scala.collection.mutable.Set[String] = Set(A, B, C)

scala> One.hashCode
res3: Int = 1491157345

scala> val Two = collection.mutable.Set[String]("B", "C", "D")
Two: scala.collection.mutable.Set[String] = Set(B, D, C)

scala> Two.hashCode
res4: Int = -967442916

scala> One += "D"
res5: One.type = Set(A, B, D, C)

scala> Two += "A"
res6: Two.type = Set(B, D, A, C)

scala> One.hashCode
res7: Int = -232075924

scala> Two.hashCode
res8: Int = -232075924

所以,是的,正如您所料,它们是正确的,因为您希望这两个实例的==方法为真。

答案 1 :(得分:2)

设置相同且内部没有任何奇怪的设置(即任何具有不稳定哈希码的内容,或哈希码与equals不一致的内容)应该具有相同的哈希码。如果不是这样,并且集合是相同类型的集合,则它是一个错误,应该报告。如果集合是不同类型的集合,则可能存在或不存在具有不同哈希码的错误(但无论如何它应该与equals一致)。我不知道任何不同的set实现不相等的情况(例如,甚至可变的BitSet与不可变的Set一致)。

所以:

  1. hashCode 从不保证是唯一的,但它应该是分布良好的,因为碰撞的概率应该很低
  2. 集合的hashCode应始终与equals一致(只要您放入集合中的所有内容都具有与equals一致的hashCode),因为相等的集合具有相等的散列代码。 (由于第(1)点,反之亦然。)
  3. 只关注内容的标识,而不是集合的添加顺序(这是设置而不是列表的重点)