构造整数数组的Hash函数

时间:2014-02-26 11:12:21

标签: c# hash hashtable

我有一个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时。

2 个答案:

答案 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开始)也可以反转以推断值

只检查尺寸长度,这样,你永远不会发现碰撞