当我从Eclipse生成相等和hashCode方法时,我面临着哈希冲突问题。
我计划使用Scala API case classes实现同样的目的,因为它会自动创建equals和hashcode。
Scala生成的方法是否足以处理哈希冲突问题?
在使用Case类时,有人面临Hash冲突问题吗?
发布于 2016-02-09 08:14:22
澄清一下:如果您的数据比哈希代码有更多的位,那么哈希冲突是不可避免的,这仅仅是因为可能的值比可能的哈希码多。
然而,scala类哈希代码使用的是MurmurHash3哈希算法,它为非加密哈希函数提供了相当好的哈希值分布。因此,case类的哈希冲突应该相对较少。但是,您仍然需要在代码中正确地处理它们!
另一个注意事项:您的代码必须正确处理哈希代码冲突。但是它们很少有一个好的散列函数。因此,如果您真的想彻底,那么您应该进行测试,在这些测试中,您有意使用相同的哈希代码的多个case类。
发布于 2016-02-09 09:50:58
小心,Scala case类定义为仅依赖于它们的参数值的对象,这意味着如果使用相同的参数构造两个实例,您将得到相同的散列和相等。
scala> case class Example(number: Int, label: String)
defined class Example
scala> val e1 = Example(42, "test")
e1: Example = Example(42,test)
scala> val e2 = Example(42, "test")
e2: Example = Example(42,test)
scala> e1 == e2
res0: Boolean = true
scala> e1.hashCode
res1: Int = 1424814261
scala> e2.hashCode
res2: Int = 1424814261
scala> class OtherExample(val number: Int, val label: String)
defined class OtherExample
scala> val o1 = new OtherExample(42, "test")
o1: OtherExample = OtherExample@6f077e50
scala> val o2 = new OtherExample(42, "test")
o2: OtherExample = OtherExample@1b0c366b
scala> o1 == o2
res3: Boolean = false
scala> o1.hashCode
res4: Int = 1862762064
scala> o2.hashCode
res5: Int = 453785195所以,你必须问问自己你想要的参数的确切分布。如果您想要区分具有相同参数的实例,那么可能常规类是更好的选择--您仍然可以得到一个自动生成的等于和hashCode。
https://stackoverflow.com/questions/35283794
复制相似问题