1

我想随机生成唯一的 64 位密钥(伪)来识别我们模型中的对象。我需要密钥在系统的所有用户中尽可能唯一(将任何 N 个密钥一起使用时发生冲突的可能性降到最低)。

现在通常的 GUID 是不可能的,因为我们的数据很便宜:)。因为我预计在同一上下文中需要使用超过 100 万个密钥,所以我认为 64 位就足够了(冲突概率约为 10e-7)。

作为旁注,我还需要一个方案将这些密钥的元组折叠/散列成一个 64 位密钥,该密钥也需要良好分布/唯一。

由于无论如何我都需要一个良好的(分布良好的)散列函数,是否可以将 GUID 对折(也许以某种方式考虑 GUID 中的固定位)?还是使用本地RNG更好?我将如何播种 RNG 以最大化跨空间/生成时间的独特性?我需要多强的RNG?

我并不是特别在寻找效率(在一定程度上),但我真的很想确保概率能够兑现他们的承诺!

4

1 回答 1

2

使用 md5 之类的快速 128 位加密散列对计数器进行散列,然后分成两部分。这将为您提供每个 64 位的“随机”独立值,它应该非常有效。

你确定你不能使用一个简单的计数器吗?

如果您需要分布式解决方案,只需在每台机器上放置一个计数器,然后将机器的 MAC 地址加上计数器进行散列即可。为了获得更好的吞吐量,每台机器使用多个计数器,每个计数器都有不同的名称(A、B 等),并对名称进行哈希处理。这是使用散列的一大优势——你可以在其中扔任何东西。请注意不要有歧义(例如,在您散列的每个事物之间放置“-”,以便名称“1”加上计数“23”不会与名称“12”和计数混淆“3”)。

于 2011-08-30T13:18:21.547 回答