【发布时间】:2015-08-24 10:28:53
【问题描述】:
我目前正在为我的自定义编程语言开发一个集合库。我已经有几种数据类型(Collection、List、Map、Set)和它们的实现(可变和不可变),但到目前为止我缺少的是hashCode 和equals。虽然这些对于 Lists 来说没有问题,因为它们是有序集合,但对于 Sets 和 Maps 起着特殊的作用。如果两个 Set 具有相同的大小和相同的元素,则它们被认为是相等的,并且 Set 维护它们的顺序不应影响它们的相等性。由于 equals-hashCode-contract,hashCode 实现也必须反映这种行为,这意味着具有相同元素但顺序不同的两个集合应该具有相同的哈希码。 (这同样适用于 Maps,它在技术上是一组键值对)
示例(伪代码):
let set1: Set<String> = [ "a", "b", "c" ]
let set2: Set<String> = [ "b", "c", "a" ]
set1 == set2 // should return true
set1.hashCode == set2.hashCode // should also return true
我如何实现一个相当好的哈希算法,让上面示例中的hashCodes 返回相同的值?
【问题讨论】:
-
集合中的一对(总和,乘积)怎么样?对于不同的数字集(据我所见),它们两者在一起并不常见。
-
例如
(e1.hashCode() + e2.hashCode() + ... + en.hashCode()) ^ (e1.hashCode() * e2.hashCode() * ... * en.hashCode())? -
你有没有尝试看看 Java 是如何实现这个的?
-
刚刚做了,它总结了元素的
hashCode -
“hash of the sum”和“sum of the hashes”有很大的区别。正如您的示例所示,前者是有问题的。如果单个散列在大范围内分布良好,则后者的问题较少。