【问题标题】:How to hash an int[] in c#如何在 C# 中散列一个 int[]
【发布时间】:2012-11-28 12:55:16
【问题描述】:

我正在想办法在从 Vector2[] 调用时覆盖 GetHashCode()。此代码为我知道相等的对象生成非唯一散列:我将以下类传递给相同的矩形,并生成不同的散列码。

public Shape(Rectangle r)
        {
            edges = new Vector2[4];
            edges[0] = new Vector2(0, 0);
            edges[1] = new Vector2(r.Width, 0);
            edges[2] = new Vector2(r.Width, r.Height);
            edges[3] = new Vector2(0, r.Height);
            Console.Write(edges.GetHashCode() + "\n");
            Position = new Vector2(r.X, r.Y);                
        }

Vector2 数组只是一堆整数。如何为整数列表创建唯一哈希?

【问题讨论】:

  • 这应该可以。你能发布一个完整的例子,展示两个相等的向量产生不同的哈希码吗?
  • 数组不提供基于数组内容的哈希码。所以这个代码不起作用。您必须自己动手,或者如果您使用 .NET 4,请使用 IStructuralEquatable interface
  • @SimonWhitehead:真的吗?那么Vector2.GetHashCode 返回什么?
  • @DavidSchwartz Vector2 实例的哈希值。但是edges.GetHashCode 不会根据数组中的每个 Vector2 实例生成散列。请注意,edges 是 Vector2 的数组。
  • @SimonWhitehead:哦!不错,不错。

标签: c# .net hash int


【解决方案1】:

你可以这样使用:

public static int CombineHashCodes(params int[] hashCodes)
{
    if (hashCodes == null)
    {
        throw new ArgumentNullException("hashCodes");
    }

    if (hashCodes.Length == 0)
    {
        throw new IndexOutOfRangeException();
    }

    if (hashCodes.Length == 1)
    {
        return hashCodes[0];
    }

    var result = hashCodes[0];

    for (var i = 1; i < hashCodes.Length; i++)
    {
        result = CombineHashCodes(result, hashCodes[i]);
    }

    return result;
}

private static int CombineHashCodes(int h1, int h2)
{
    return (h1 << 5) + h1 ^ h2;

    // another implementation
    //unchecked
    //{
    //    var hash = 17;

    //    hash = hash * 23 + h1;
    //    hash = hash * 23 + h2;

    //    return hash;
    //}
}

【讨论】:

  • 因此,它一次循环通过一个数组两个整数,携带一个总数,每次迭代移位五位,并自行递增^下一个数字。也许我不明白位移是如何工作的,但这不会产生一个巨大的数字吗?我应该在最后修改我的哈希表的大小吗?无论如何,我觉得这很有帮助。
  • @MaxKessler 否。它使用运行中的“桶形哈希”(h1 与 h2 混合),因此它永远不会超过 int 的大小,并且 从末尾移出的位会被丢弃我>。请记住,通常,哈希不是(也不能是)唯一的;它们必须是稳定的,并且希望分布良好。
  • 明白!我更改了我的代码,以便不使用碰撞来识别两个对象是否相等:我做了一些研究,并在我的对象上覆盖了 equals 方法。非常感谢!
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
相关资源
最近更新 更多