大整数集的完美散列函数[1..2 ^ 64 - 1]

时间:2017-05-26 11:28:23

标签: algorithm computer-science hash-function perfect-hash

我需要构造一个完美的哈希函数,将一组整数[1..2 ^ 64 - 1]映射到它自己(这个函数实际上是一些复杂的排列)。

为了解释这个问题,假设我们在数据库中有一系列整数主键。我们需要显示构造一个数字(我们向用户显示),使得关闭数字对应于尽可能远离彼此的主键。

所以,基本上我需要一个大的整数集的双射函数。 E.g。

  • 1 - > X1
  • 2 - > X3
  • 3 - > X3
  • ...
  • 2 ^ 64 - 1 - > X2 ^ 64 - 1

任何建议或参考将不胜感激。

1 个答案:

答案 0 :(得分:0)

要在0到upperlimit(不包括)的空格中最大限度地分隔任意两个数字,我会将它们的距离设置为大约upperlimit的一半。

在python中它看起来像这样(代码仅在upperlimit为偶数时有效,否则最后一个元素发生碰撞):

def my_hash(n, upperlimit):
    return n * upperlimit / 2 % upperlimit + n / 2

def my_unhash(n, upperlimit):
    return n % (upperlimit / 2) * 2 + n / (upperlimit / 2)

示例结果:

upperlimit = 16
for i in range(upperlimit):
    h = my_hash(i, upperlimit)
    u = my_unhash(h, upperlimit)
    print "%02d -> %02d -> %02d" % (i, h, u)

00 -> 00 -> 00
01 -> 08 -> 01
02 -> 01 -> 02
03 -> 09 -> 03
04 -> 02 -> 04
05 -> 10 -> 05
06 -> 03 -> 06
07 -> 11 -> 07
08 -> 04 -> 08
09 -> 12 -> 09
10 -> 05 -> 10
11 -> 13 -> 11
12 -> 06 -> 12
13 -> 14 -> 13
14 -> 07 -> 14
15 -> 15 -> 15

第二列显示散列值。如果需要,可以排除0,因为它映射到自身。