我应该使用通用实用程序从多个字段生成 HashCode 吗?
Should I use a common utility for generating a HashCode from multiple fields?
我正在查看 Tuple<T1,T2>
的源代码,它的 GetHashCode()
方法使用 this internal helper:
Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2));
}
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}
由于比较对象并因此使用 GetHasCode()
是一项如此常见的任务,我很好奇 CLR 或 .NET 是否提供任何 helper/utility 来执行此操作,所以没有不得不一遍又一遍地编写相同的代码并冒着引入错误的风险?
嗯,你当然可以使用Tuple.Create(h1, h2).GetHashCode()
。使用很可能在下一个版本中的 ValueTuple
(对于 C#7 可能支持的那种元组),您甚至不需要分配。
与此同时,这与您所拥有的差不多,尽管有人建议应该更多。
一个紧迫的问题是,它会阻止人们思考价值观吗?可以看到什么范围的值,通常会看到等等。您提供的代码不一定是将两个整数组合成哈希码的最佳方法。如果很少有两个对象具有相同的 h1
,那么 return h1
可能会更好。如果 h1
始终在 0 到 15 的范围内并且 h2
很少超过几百,那么 (h1 << 4) + h2
可能会更好。如果 h1
和 h2
将根据用户输入直接设置,那么您需要混合随机种子以防止 hash-DoSing 等
我正在查看 Tuple<T1,T2>
的源代码,它的 GetHashCode()
方法使用 this internal helper:
Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2));
}
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}
由于比较对象并因此使用 GetHasCode()
是一项如此常见的任务,我很好奇 CLR 或 .NET 是否提供任何 helper/utility 来执行此操作,所以没有不得不一遍又一遍地编写相同的代码并冒着引入错误的风险?
嗯,你当然可以使用Tuple.Create(h1, h2).GetHashCode()
。使用很可能在下一个版本中的 ValueTuple
(对于 C#7 可能支持的那种元组),您甚至不需要分配。
与此同时,这与您所拥有的差不多,尽管有人建议应该更多。
一个紧迫的问题是,它会阻止人们思考价值观吗?可以看到什么范围的值,通常会看到等等。您提供的代码不一定是将两个整数组合成哈希码的最佳方法。如果很少有两个对象具有相同的 h1
,那么 return h1
可能会更好。如果 h1
始终在 0 到 15 的范围内并且 h2
很少超过几百,那么 (h1 << 4) + h2
可能会更好。如果 h1
和 h2
将根据用户输入直接设置,那么您需要混合随机种子以防止 hash-DoSing 等