我被要求寻找一个完美的散列/单向函数,以便能够散列10 ^ 11个数字。 然而,由于我们将使用嵌入式设备,它将不会有内存来存储相关的存储桶,所以我想知道是否有可能在没有它们的情况下获得一个体面的(最小的)完美哈希?
计划是使用设备散列数字,我们使用彩虹表或使用散列作为偏移量的文件。
干杯
编辑:
我会尝试提供更多信息:)
1)10 ^ 11实际上现在是10 ^ 10所以这使得它更容易。这个数字是可能的组合。所以我们可以得到一个介于0000000001和10000000000(10 ^ 10)之间的数字。
2)计划对我们来说是单向函数的一部分,使数字安全,所以我们可以通过不安全的方式发送它。 然后我们将使用彩虹表在另一端查找原始数字。 问题是设备的源通常有512k-4Meg的内存可供使用。
3)它必须是完美的 - 我们100%不会发生碰撞。
EDIT2:
4)我们不能使用加密,因为我们已经被告知它在设备上并不是真的可能,如果可能的话,关键人物将是一场噩梦。Edit3:
由于这是不明智的,现在是纯粹的学术问题(我保证)
答案 0 :(得分:7)
答案 1 :(得分:1)
除非你有至少与输入一样多的哈希桶,否则显然没有“完美”哈希这样的东西;如果不这样做,则不可避免地会有两个输入共享相同的哈希桶。
但是,您不太可能将所有的数字存储在0到10 ^ 11之间。那样的模式是什么?如果存在模式,则可能存在实际数据集的完美哈希函数。
尽管如此,找到一个“完美”的哈希函数并不是那么重要。哈希表非常快。具有非常低的碰撞率的函数 - 当散列整数时,这意味着几乎任何简单的函数,如模数 - 都很好,你将获得O(1)平均性能。