我正在查看 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 是否提供任何帮助程序/实用程序来执行此操作,这样就不必一遍又一遍地编写相同的代码并冒着引入错误的风险?
最佳答案
好吧,你当然可以使用 Tuple.Create(h1, h2).GetHashCode()
.随着ValueTuple
这很可能会出现在下一个版本中(对于 C#7 可能支持的那种元组),您甚至不需要分配。
不过与此同时,这与您所拥有的差不多,尽管有人建议应该有更多。
不过,一个紧迫的问题是,它会阻止人们思考值(value)观吗?可以看到什么范围的值,通常会看到等等。您提供的代码不一定是将两个整数组合成哈希码的最佳方法。如果两个对象很少有相同的 h1
然后 return h1
有待改善。如果h1
始终在 0 到 15 和 h2
的范围内很少超过几百个(h1 << 4) + h2
有待改善。如果h1
和 h2
将根据用户输入直接设置,然后您需要混合随机种子以防止 hash-DoSing 等。
关于c# - 我应该使用通用实用程序从多个字段生成 HashCode 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37302339/