我有一个int数组,我想为它创建一个哈希函数,这样两个具有不同元素的整数数组会产生相同的哈希值,可能性很小,最好的方法是什么?
数组的长度最多为500,整数可以是0到50。
请注意,问题没有完全相同,因为整数数组的性质(数字的长度和范围)是不同的。
我之前使用过
public int GetHashCode(int[] data)
{
if (data == null)
return 0;
int result = 17;
foreach (var value in data)
{
result += result * 23 + value;
}
return result;
}
但我发现它有很多碰撞。
我想解决的是构造一个dictionary<int[], string>
,以便当相同值的整数产生不同的Hashcode时。
答案 0 :(得分:3)
具有不同元素的两个整数数组不会产生相同的哈希值
对于具有多个元素的数组,这是不可能的。具有N
个元素的数组具有32*N
个信息位,除非N
= 1,否则您无法将其映射到哈希代码的32位而不会丢失某些信息。
对于N
&gt; 1,将有非常多的数组对,其哈希码相同,而数组则不同。有些技术使得随机选择的一对数组不太可能具有相同的哈希码,但是对于一般情况,不可能完全消除冲突。
数组的长度可以达到500,整数可以是0到50
你需要大约2500位代表这样的数组;你的哈希值只有32位,所以你也会有很多哈希冲突。您可以通过将数字打包在int
中来使用值为0..50的0到5个元素的数组执行完美哈希(使用值51表示“缺失值”,以便您可以打包不同长度的数组)。一旦你需要在混合中添加第六个数字,你的哈希就不再是完美的了。
答案 1 :(得分:0)
500个值从0到50表示您可以存储所有值的总和乘以50和位置(从0开始)也可以反转以推断值
只检查尺寸长度,这样,你永远不会发现碰撞