C#.NET GetHashCode函数问题

时间:2011-09-05 14:08:07

标签: c# .net class gethashcode

嗨,我有一个包含6个字符串属性的类。对于这些字段中的至少一个,唯一对象将具有不同的值

要实现IEqualityComparer的GetHashCode函数,我将连接所有6个属性并在结果字符串上调用GetHashCode。

我有以下疑惑:

  1. 是否需要在唯一值上调用GetHashcode?
  2. 对六个属性的连接操作是否会使比较变慢?
  3. 我应该使用其他方法吗?

4 个答案:

答案 0 :(得分:4)

如果您的字符串字段名为a-f且已知不为null,则这是ReSharper对GetHashCode()的建议

public override int GetHashCode() {
  unchecked {
    int result=a.GetHashCode();
    result=(result*397)^b.GetHashCode();
    result=(result*397)^c.GetHashCode();
    result=(result*397)^d.GetHashCode();
    result=(result*397)^e.GetHashCode();
    result=(result*397)^f.GetHashCode();
    return result;
  }
}

答案 1 :(得分:3)

如果在这些对象上调用Equals(),则GetHashCode()应为返回true的所有对象返回相同的哈希码。这意味着,例如,无论字段值是什么,您都可以返回零作为哈希码。但是当存储在诸如散列表之类的数据结构中时,这将使您的对象效率非常低。

组合字符串是一个选项,但请注意,例如,您可以只为哈希代码组合两个字符串(同时仍然比较equals中的所有字符串!)。

您还可以组合六个单独字符串的哈希值,而不是为组合字符串计算单个哈希值。例如,参见 Quick and Simple Hash Code Combinations

我不确定这是否会比连接字符串快得多。

答案 2 :(得分:3)

GetHashCode不需要为“不等”对象返回不相等的值。它只需要为相等的对象返回相等的值(它也必须在对象的生命周期内返回相同的值)。

这意味着:

  1. 如果两个对象与Equals相等,那么他们的GetHashCode必须返回相同的值。
  2. 如果6个字符串属性中的某些属性不是严格只读的,则它们不能参与GetHashCode实现。
  3. 如果你不能同时满足这两个要点,你应该重新评估你的设计,因为其他任何东西都会让你的门被打开。

    最后,你可以通过在6个字符串中的每个字符串上调用GetHashCode然后使用一些按位操作将所有6个结果集成到一个值中来加快GetHashCode

答案 3 :(得分:0)