Scala:原始类型hashCode唯一性

时间:2017-11-01 14:16:06

标签: scala

试着澄清下一个代码是否会为原始类型生成唯一的哈希码:

val t = List(1, "test", 1232, 2.55, "Data", "Correct")
t.map(x => ClassTag(x.getClass).hashCode )

以下是最后一行的结果:

res5: List[Int] = List(764977973, 1554547125, 764977973, 737810352, 1554547125, 1554547125

我们可以假设下一个哈希码在不同的物理机器上是唯一的吗?

1 个答案:

答案 0 :(得分:3)

哈希可以通过定义永远不会是唯一的。哈希将较大(可能无限)的输入空间映射到较小(通常是有限的)输出空间。 Pigeonhole原则说必须是多个输入值,映射到相同的输出值。 (如果你不熟悉鸽笼原理,它真的很简单:如果你有三双袜子和两个抽屉,那么无论你如何在抽屉中分发袜子,都必须是至少一个带至少两个袜子对的抽屉。)

有无限多个可能的Scala对象,但只有有限多个哈希码,因此,必须至少有一个哈希代码具有无限多个映射到它的对象。实际上,由于哈希码通常以良好分布的方式编写,因此每个哈希代码都会有无数个映射到它的对象。

hashCodeInt s。这意味着完全hashCode一样多Int s。因此,如果hashCode s 是唯一的,那么对于所有其他对象(hashCode s,{Float,{}不会留下任何Double {1}},Long s,String s,Char s,Boolean s,List s,Array s,{{ 1}} s,Symbol s,依此类推)。仅仅查看Map必须至少有40亿Long个具有相同Long的对象。