【问题标题】:Perfect hash function for large set of integers [1..2^64 - 1] [duplicate]大型整数集的完美哈希函数 [1..2^64 - 1] [重复]
【发布时间】:2017-05-26 22:12:22
【问题描述】:

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

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

所以,基本上我需要一个用于大量整数的双射函数。例如

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

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

【问题讨论】:

  • 接近数字之间的最小“距离”是可接受的?
  • 没有硬性限制。基本上我需要在更广泛的范围内传播序列号。
  • 模乘以奇数是双射的并保持在该范围内(0映射到自身,因此如果它不在输入范围内,则不在输出范围内)
  • 如果你需要保留 0,你总是可以使用 g(x) = f(x) - f(0) 来表示任何双射函数 f
  • 使用任何方便的加密功能。

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


【解决方案1】:

要在 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,因为它映射到自身。

【讨论】:

  • 不确定该要求有多重要,但请注意,将空格分成 2 时,您可以使任意 2 个连续的数字相距很远,但如果跳过每隔一个数字,它们就会接近 0 - > 0, 2 -> 1, 4 -> 2... 同样适用于奇数。更好的策略(如果我们想减少相隔 2 的数字的接近度)是将可用空间划分为 N 个桶并在这些桶之间打乱数字。显然,使用 N 个桶意味着每个第 N 个数字都会接近……但是通过调整 N(比如对于 64 位空间,使用 N 作为 1024 或 2 的更高幂)会产生传播。
  • 好点,这里要求不明确。我最大化了连续数字的距离。
猜你喜欢
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多