类似值的GetHashCode
本文关键字:GetHashCode | 更新日期: 2023-09-27 18:27:03
我有以下类:
public class Foo
{
int year;
string name;
int category;
}
以下是一些示例数据:
2012 Test1 1000
2012 Test2 1000
2012 Test3 1000
2012 Test4 1000
2012 Test4 10
...
如果我覆盖GetHashCode,所有结果都非常相似:
return year ^ name ^ category;
int hash = 13;
hash = hash * 33 + year.GetHashCode();
hash = hash * 33 + name.GetHashCode();
hash = hash * 33 + category.GetHashCode();
return hash;
对于这种情况,什么是好的散列函数(具有最大分布)?
编辑:也许我对散列桶的理解是错误的。将相似的哈希值放入同一个bucket?
"Test1".GetHashCode() --> -1556460260
"Test2".GetHashCode() --> -1556460257
我建议检查String对象是否为null。
实现似乎很好,会很相似,但哈希码应该不同,因为主要目标是让它们放在不同的桶中,从而有助于进一步的操作。
public int hashCode() { // Assuming year and category are String like name.
int hash = 31;
hash = hash * 331 + (this.year != null ? this.year.GethashCode() : 0);
hash = hash * 331 + (this.name != null ? this.name.GethashCode() : 0);
hash = hash * 331 + (this.category != null ? this.category.GethashCode() : 0);
return hash;
}
我在重写hashCode时学到的几个步骤是
- 选择素数散列,例如5、7、17或31(素数作为散列,会为不同对象生成不同的散列代码)
- 取另一个素数作为不同于hash的乘数是好的
- 计算每个成员的哈希代码,并将它们添加到最终哈希中。对所有平等参与的成员重复此操作
- 返回散列