映射功能

时间:2011-04-25 17:54:17

标签: algorithm math hash

我有一组128位的数字和设置的大小< 2 ^ 32 ...所以理论上我可以有一个映射函数,将所有128位数字映射到32位数....如何构造映射函数???

4 个答案:

答案 0 :(得分:3)

好像你正在寻找一个最小 perfect hash,它将n个键映射到n个连续的整数。

上面句子中的wiki页面链接提到了两个实现此目的的库。

另见详情:http://burtleburtle.net/bob/hash/perfect.html

答案 1 :(得分:0)

在不知道输入数据的性质的情况下,不可能给出最优的散列算法。但如果输入均匀分布,则可以使用输入的低32位。这意味着碰撞的可能性,所以你必须处理它。

答案 2 :(得分:0)

通用结构是将所有128位值保存在一个大数组中,按升序排序。然后,将每个值“映射”到其数组中的索引。要“计算”地图,可以在数组中进行二进制搜索,以获得数组中值的精确索引。使用2 32 值,数组的大小为64 GB,二进制搜索需要在数组中进行35次左右的查找。

总的来说,你不能做得更好。但是,如果您的128位值具有相当均匀的分布(取决于它们来自何处),则可以大幅度压缩大数组结构,特别是如果您可以保证地图的所有输入始终是其中的一部分一组128位值;我敢打赌,你可以把它减少到几千兆字节 - 但查找会更贵。

要获得更实用的解决方案,您必须使用128位值的结构:它们来自哪里,它们代表什么......

答案 3 :(得分:0)

将数字的位置设置为2 ^ 32的值的除法。