c# . net GetHashCode函数问题

本文关键字:问题 函数 GetHashCode net | 更新日期: 2023-09-27 18:07:29

嗨,我有一个类6字符串属性。

一个唯一的对象至少有一个不同的值

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

我有以下疑问:

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

c# . net GetHashCode函数问题

如果您的字符串字段命名为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;
  }
}

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

这意味着:

  1. 如果两个对象比较Equals相等,则它们的GetHashCode必须返回相同的值。
  2. 如果6个字符串属性中的一些不是严格只读的,它们不能参与GetHashCode的实现。

如果你不能同时满足这两点,你应该重新评估你的设计,因为其他任何事情都会为bug敞开大门。

最后,您可以通过对6个字符串中的每个字符串调用GetHashCode,然后使用一些按位操作将所有6个结果集成为一个值,从而使GetHashCode更快。

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

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

您还可以组合六个单独字符串的哈希值,而不是为组合字符串计算单个哈希值。参见示例快速和简单的哈希码组合

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

您可以使用下列行为:

http://moh-abed.com/2011/07/13/entities-and-value-objects/