在.NET GetHashCode方法中,很多地方都使用.NET 方法.特别是在快速查找集合中的项目或确定相等性时.是否有关于如何GetHashCode为我的自定义类实现覆盖的标准算法/最佳实践,因此我不会降低性能?
我有许多不相关的命名事物,我想快速搜索."aardvark"在任何地方始终都是"aardvark",因此对字符串进行散列并重用整数可以很好地加速比较.整个名称集是未知的(并随着时间的推移而变化).什么是快速字符串哈希算法,它将生成小(32或16)位值并具有低冲突率?
我想看一个特定于C/C++的优化实现.
在阅读StackOverflow上有关覆盖的所有问题和答案之后,GetHashCode()我编写了以下扩展方法,以便轻松方便地覆盖GetHashCode():
public static class ObjectExtensions
{
private const int _seedPrimeNumber = 691;
private const int _fieldPrimeNumber = 397;
public static int GetHashCodeFromFields(this object obj, params object[] fields) {
unchecked { //unchecked to prevent throwing overflow exception
int hashCode = _seedPrimeNumber;
for (int i = 0; i < fields.Length; i++)
if (fields[i] != null)
hashCode *= _fieldPrimeNumber + fields[i].GetHashCode();
return hashCode;
}
}
}
Run Code Online (Sandbox Code Playgroud)
(我基本上只重构了有人在那里发布的代码,因为我真的很喜欢它可以一般使用)
我用的是这样的:
public override int GetHashCode() {
return this.GetHashCodeFromFields(field1, field2, field3);
}
Run Code Online (Sandbox Code Playgroud)
你看到这段代码有什么问题吗?
我写了一个自定义比较器类.
public class ItemComparer : IEqualityComparer<Item>
{
public int GetHashCode(Item x)
{
return (x == null) ? 0 : new { x.Name, x.CompanyCode,
x.ShipToDate, x.Address }.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)
当我新建两个项目并比较哈希码时,我的测试失败了.为什么哈希不同?
[TestMethod]
public void Two_New_Items_Have_The_Same_Hash_Code()
{
// arrange
var comparer = new ItemComparer();
Item x = new Item();
Item y = new Item();
// act
int xHash = comparer.GetHashCode(x);
int yHash = comparer.GetHashCode(y);
// assert
Assert.AreEqual(xHash, yHash);
}
Run Code Online (Sandbox Code Playgroud)
编辑 - 这是完整的课程.我简单地使用上面的例子来简洁,但需要更多的信息
public class DtoPolicy : DtoBase
{
[Description("The Policy Number")]
public string PolicyNumber …Run Code Online (Sandbox Code Playgroud) 我有一个类,它具有许多我正在实现的属性IEquitable<T>.我找到了关于如何为少量属性执行GetHashCode()的多个示例.
public override int GetHashCode()
{
unchecked // Overflow is fine, just wrap
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();
hash = hash * 23 + field3.GetHashCode();
return hash;
}
}
Run Code Online (Sandbox Code Playgroud)
当我在对象上有数百个属性时,我该怎么回事?