我有以下课程:
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;
对于这种情况,什么是好的哈希函数(具有最大分布)?
修改 也许我对哈希桶的理解是错误的。将类似的哈希值传递给同一个存储桶?
"Test1".GetHashCode() --> -1556460260
"Test2".GetHashCode() --> -1556460257
答案 0 :(得分:2)
我建议的一件事是检查字符串对象是否为空。
实现看起来很好,它会很相似,但是哈希码应该是不同的,因为主要目标是让它们落在不同的桶中,从而有助于进一步的操作。
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(素数作为哈希,导致不同对象的不同哈希码)。
- 取另一个素数作为与哈希不同的乘数。
- 为每个成员计算哈希码并将其添加到最终哈希中。对参与equals的所有成员重复此操作。
- 返回哈希。
醇>