嗨,我有一个有 6 个字符串属性的类。一个唯一的对象将至少对这些字段中的一个具有不同的值
为了实现 IEqualityComparer 的 GetHashCode 函数,我将连接所有 6 个属性并在结果字符串上调用 GetHashCode。
我有以下疑问:
- 是否有必要在唯一值上调用 GetHashcode?
- 六个属性的串联操作会不会导致比较慢?
- 我应该使用其他方法吗?
嗨,我有一个有 6 个字符串属性的类。一个唯一的对象将至少对这些字段中的一个具有不同的值
为了实现 IEqualityComparer 的 GetHashCode 函数,我将连接所有 6 个属性并在结果字符串上调用 GetHashCode。
我有以下疑问:
如果您的字符串字段被命名为 af 并且已知不为空,这是 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
does not need to return unequal values for "unequal" objects. It only needs to return equal values for equal objects (it also must return the same value for the lifetime of the object).
This means that:
Equals
, then their GetHashCode
must return the same value.GetHashCode
implementation.If you cannot satisfy both points at the same time, you should re-evaluate your design because anything else will leave the door open for bugs.
Finally, you could probably make GetHashCode
faster by calling GetHashCode
on each of the 6 strings and then integrating all 6 results in one value using some bitwise operations.
如果您对这些对象调用 Equals(),则 GetHashCode() 应该为所有返回 true 的对象返回相同的哈希码。这意味着,例如,无论字段值是什么,您都可以返回零作为哈希码。但这会使您的对象在存储在诸如哈希表之类的数据结构中时非常低效。
组合字符串是一种选择,但请注意,您可以例如仅组合两个字符串作为哈希码(同时仍然比较所有字符串等于!)。
您还可以组合六个单独字符串的哈希,而不是为组合字符串计算单个哈希。参见例如 快速和简单的哈希码组合
我不确定这是否会比连接字符串快得多。