Tag: 法哈希

在许多GetHashCode实现中,为什么在xoring之前乘以素数?

我知道在xoring之前乘以大量的数字应该有助于分配错误的操作数,但为什么乘数应该是素数呢? 有关: 散列函数为什么要使用素数模数? 关闭,但不是很重复: 为什么String中的Java hashCode()使用31作为乘数?

与顺序无关的哈希算法

我目前正在为自定义编程语言开发一个集合库。 我已经有了几种数据类型(Collection,List,Map,Set)和它们的实现(可变和不可变),但到目前为止我所缺少的是hashCode和equals 。 虽然列表没有问题,因为它们是有序集合,但它们对集合和地图起着特殊的作用。 如果两个集合具有相同的大小和相同的元素,则它们被认为是相等的,并且集合维护它们的顺序不应该在它们的相等性上有所不同。 由于equals-hashCode-contract, hashCode实现也必须反映这种行为,这意味着具有相同元素但排序不同的两个集应该具有相同的哈希码。 (这同样适用于地图,这在技术上是一组键值对) 示例 (伪代码): let set1: Set = [ “a”, “b”, “c” ] let set2: Set = [ “b”, “c”, “a” ] set1 == set2 // should return true set1.hashCode == set2.hashCode // should also return true 我如何实现一个相当好的哈希算法,上面例子中的hashCode s返回相同的值?