首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala案例类与哈希冲突

Scala案例类与哈希冲突
EN

Stack Overflow用户
提问于 2016-02-09 04:17:48
回答 2查看 1.2K关注 0票数 0

当我从Eclipse生成相等和hashCode方法时,我面临着哈希冲突问题。

我计划使用Scala API case classes实现同样的目的,因为它会自动创建equalshashcode

Scala生成的方法是否足以处理哈希冲突问题?

在使用Case类时,有人面临Hash冲突问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-09 08:14:22

澄清一下:如果您的数据比哈希代码有更多的位,那么哈希冲突是不可避免的,这仅仅是因为可能的值比可能的哈希码多。

然而,scala类哈希代码使用的是MurmurHash3哈希算法,它为非加密哈希函数提供了相当好的哈希值分布。因此,case类的哈希冲突应该相对较少。但是,您仍然需要在代码中正确地处理它们!

另一个注意事项:您的代码必须正确处理哈希代码冲突。但是它们很少有一个好的散列函数。因此,如果您真的想彻底,那么您应该进行测试,在这些测试中,您有意使用相同的哈希代码的多个case类。

票数 7
EN

Stack Overflow用户

发布于 2016-02-09 09:50:58

小心,Scala case类定义为仅依赖于它们的参数值的对象,这意味着如果使用相同的参数构造两个实例,您将得到相同的散列和相等。

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35283794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档