嗨,我有一个包含6个字符串属性的类。对于这些字段中的至少一个,唯一对象将具有不同的值
要实现IEqualityComparer的GetHashCode函数,我将连接所有6个属性并在结果字符串上调用GetHashCode。
我有以下疑惑:
答案 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中的所有字符串!)。
您还可以组合六个单独字符串的哈希值,而不是为组合字符串计算单个哈希值。例如,参见 Quick and Simple Hash Code Combinations
我不确定这是否会比连接字符串快得多。
答案 2 :(得分:3)
GetHashCode
不需要为“不等”对象返回不相等的值。它只需要为相等的对象返回相等的值(它也必须在对象的生命周期内返回相同的值)。
这意味着:
Equals
相等,那么他们的GetHashCode
必须返回相同的值。GetHashCode
实现。如果你不能同时满足这两个要点,你应该重新评估你的设计,因为其他任何东西都会让你的门被打开。
最后,你可以通过在6个字符串中的每个字符串上调用GetHashCode
然后使用一些按位操作将所有6个结果集成到一个值中来加快GetHashCode
。
答案 3 :(得分:0)