C# 如何在c中散列int[]#

C# 如何在c中散列int[]#,c#,.net,hash,int,C#,.net,Hash,Int,我正试图想出一种方法,在从Vector2[]调用时重写GetHashCode()。这段代码为我知道相等的对象生成非唯一散列:我将相同的矩形传递给下面的类,并生成不同的散列代码 public Shape(Rectangle r) { edges = new Vector2[4]; edges[0] = new Vector2(0, 0); edges[1] = new Vector2(r.Width, 0);

我正试图想出一种方法,在从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);                
        }

矢量2数组只是一堆整数。如何为整数列表创建唯一的哈希

您可以使用以下内容:

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;
    //}
}
公共静态int组合hashCodes(参数int[]hashCodes)
{
if(hashCodes==null)
{
抛出新的ArgumentNullException(“hashCodes”);
}
if(hashCodes.Length==0)
{
抛出新的IndexOutOfRangeException();
}
if(hashCodes.Length==1)
{
返回哈希码[0];
}
var结果=哈希代码[0];
for(var i=1;i返回(h1这应该行得通。你能发布一个完整的示例,显示两个相等的向量产生不同的哈希代码吗?数组不提供基于数组内容的哈希代码。因此,此代码不起作用。你必须自己滚动,或者如果你在.NET 4上使用。@SimonWhitehead:真的吗?那么返回什么?@DavidSchwartz用于Ve的哈希ctor2实例。但是
edges.GetHashCode
不会基于数组中的每个Vector2实例生成哈希。请注意,edges是Vector2的数组。@SimonWhitehead:哦!对了,捕捉得很好。因此,它一次循环一个数组两个整数,每次循环都携带一个总值,该值被移位五位,并在下一次循环中自动递增^也许我不明白位移位是如何工作的,但这不会产生一个巨大的数字吗?我应该在最后根据哈希表的大小进行修改?不管怎样,我觉得这很有用。@MaxKessler没有。它使用一个正在运行的“桶哈希”(h1与h2混合)因此,它永远不会超过int的大小,并且从末尾移出的位会被丢弃。请记住,通常情况下,哈希不会(也不能)被丢弃唯一的;它们必须是稳定的,希望是均匀分布的。明白了!我更改了代码,以便不使用冲突作为识别两个对象是否相等的手段:我做了一些研究,并对我的对象使用了equals方法。非常感谢!