GetHashCode表示类似的值

时间:2013-08-08 13:21:40

标签: c# .net gethashcode

我有以下课程:

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

1 个答案:

答案 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时学到的几个步骤是

  
      
  1. 选择主要哈希,例如5,7,17​​或31(素数作为哈希,导致不同对象的不同哈希码)。
  2.   
  3. 取另一个素数作为与哈希不同的乘数。
  4.   
  5. 为每个成员计算哈希码并将其添加到最终哈希中。对参与equals的所有成员重复此操作。
  6.   
  7. 返回哈希。
  8.