散列函数将唯一的int数组映射到范围为0..n的索引

时间:2014-10-04 20:07:43

标签: c++ c arrays hash cuda

我需要映射一个排序整数数组,其长度从最大值1到4变化到全局数组的索引。就像[13,24,32]成为0..n范围内的数字一样,没有其他数组映射到同一个数字。 数组的数量是几百万,并且映射必须是"唯一的" (或者至少对于较小的数组只有很少的碰撞),因为这些数组表示项目集,我使用k-1较小的项目集来构建大小为k的那个。

我当前的实现使用了一个高效的哈希函数,它为一个数组产生0..1之间的双倍,并且我将项目集存储在STL Map中,并将double作为键。来自这篇文章:

<磷>氮。 D. Atreas,C。Karanikas“基于素数和散列近似的更快模式匹配算法”,2007

我要在CUDA中实现这个的并行版本,所以我不能使用像STL Map这样的东西。我可以轻松地创建自己平衡的二进制搜索树作为GPU全局内存中的映射,但这将非常慢。因此,为了将全局内存访问减少到最小,我需要将itemset映射到全局内存中的一个巨大的数组。

我尝试将double转换为长整数并使用64位哈希函数对其进行哈希处理,但它会产生一些冲突,如预期的那样。

所以,我问是否有一个&#34;独特的&#34; hash函数,用于0..1之间的双精度数,或者是大小为1..4的整数数组,它为大小为N的表提供唯一索引。

1 个答案:

答案 0 :(得分:1)

如果我对你的数组做出假设:

each item of your arrays (such as 13) are 32-bit integers.

然后你问的是不可能的。

您至少有2 ^(32 * 4)个可能的值,或128位。而你正在尝试将它们打包成一个更小的数组(20位,一百万个条目)。如果没有冲突,你就无法做到这一点(或者元素之间存在一些协议,例如每个元素选择&#34;下一个可用的索引&#34;,但那不是哈希)。