相关疑难解决方法(0)

重写System.Object.GetHashCode的最佳算法是什么?

在.NET GetHashCode方法中,很多地方都使用.NET 方法.特别是在快速查找集合中的项目或确定相等性时.是否有关于如何GetHashCode为我的自定义类实现覆盖的标准算法/最佳实践,因此我不会降低性能?

.net algorithm hashcode gethashcode

1389
推荐指数
14
解决办法
19万
查看次数

具有32位整数的低冲突率的快速字符串哈希算法

我有许多不相关的命名事物,我想快速搜索."aardvark"在任何地方始终都是"aardvark",因此对字符串进行散列并重用整数可以很好地加速比较.整个名称集是未知的(并随着时间的推移而变化).什么是快速字符串哈希算法,它将生成小(32或16)位值并具有低冲突率?

我想看一个特定于C/C++的优化实现.

c++ string algorithm hash

65
推荐指数
6
解决办法
8万
查看次数

GetHashCode扩展方法

在阅读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)

你看到这段代码有什么问题吗?

c# hash hashcode gethashcode

12
推荐指数
1
解决办法
5314
查看次数

为什么两个新对象没有相同的哈希码?

我写了一个自定义比较器类.

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)

c#

6
推荐指数
1
解决办法
156
查看次数

对具有大量属性的类实现GetHashCode()的最佳方法是什么?

我有一个类,它具有许多我正在实现的属性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)

当我在对象上有数百个属性时,我该怎么回事?

c# hashcode

4
推荐指数
3
解决办法
7203
查看次数

标签 统计

c# ×3

hashcode ×3

algorithm ×2

gethashcode ×2

hash ×2

.net ×1

c++ ×1

string ×1