试着澄清下一个代码是否会为原始类型生成唯一的哈希码:
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
)
我们可以假设下一个哈希码在不同的物理机器上是唯一的吗?
答案 0 :(得分:3)
哈希可以通过定义永远不会是唯一的。哈希将较大(可能无限)的输入空间映射到较小(通常是有限的)输出空间。 Pigeonhole原则说必须是多个输入值,映射到相同的输出值。 (如果你不熟悉鸽笼原理,它真的很简单:如果你有三双袜子和两个抽屉,那么无论你如何在抽屉中分发袜子,都必须是至少一个带至少两个袜子对的抽屉。)
有无限多个可能的Scala对象,但只有有限多个哈希码,因此,必须至少有一个哈希代码具有无限多个映射到它的对象。实际上,由于哈希码通常以良好分布的方式编写,因此每个哈希代码都会有无数个映射到它的对象。
hashCode
是Int
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
的对象。