c# . net GetHashCode函数问题
本文关键字:问题 函数 GetHashCode net | 更新日期: 2023-09-27 18:07:29
嗨,我有一个类6字符串属性。
一个唯一的对象至少有一个不同的值为了实现IEqualityComparer的GetHashCode函数,我将所有6个属性连接起来,并在结果字符串上调用GetHashCode。
我有以下疑问:
- 有必要在一个唯一的值上调用GetHashcode吗?
- 6个属性的连接操作会使比较变慢吗?
- 我应该使用其他方法吗?
如果您的字符串字段命名为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
不需要为"不相等"的对象返回不相等的值。它只需要为相等的对象返回相等的值(它还必须在对象的生命周期内返回相同的值)。
这意味着:
- 如果两个对象比较
Equals
相等,则它们的GetHashCode
必须返回相同的值。 - 如果6个字符串属性中的一些不是严格只读的,它们不能参与
GetHashCode
的实现。
如果你不能同时满足这两点,你应该重新评估你的设计,因为其他任何事情都会为bug敞开大门。
最后,您可以通过对6个字符串中的每个字符串调用GetHashCode
,然后使用一些按位操作将所有6个结果集成为一个值,从而使GetHashCode
更快。
GetHashCode()应该为所有返回true的对象返回相同的哈希码,如果在这些对象上调用Equals()。这意味着,例如,无论字段值是什么,都可以返回0作为散列码。但是,这将使您的对象在存储在哈希表等数据结构中时效率非常低。
组合字符串是一种选择,但请注意,例如,您可以仅组合两个字符串用于哈希码(同时仍然比较equals中的所有字符串!)。
您还可以组合六个单独字符串的哈希值,而不是为组合字符串计算单个哈希值。参见示例快速和简单的哈希码组合
我不确定这是否会比连接字符串快得多。
您可以使用下列行为:
http://moh-abed.com/2011/07/13/entities-and-value-objects/