C# 如何在c中散列int[]#
我正试图想出一种方法,在从Vector2[]调用时重写GetHashCode()。这段代码为我知道相等的对象生成非唯一散列:我将相同的矩形传递给下面的类,并生成不同的散列代码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);
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方法。非常感谢!