如何生成唯一的64位密钥

时间:2011-08-30 13:03:46

标签: random unique-key

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

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

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

因为无论如何我需要一个好的(分布良好的)散列函数,可以将GUID折叠成两半(可能以某种方式考虑GUID中的固定位)吗?或者使用本地RNG更好?我将如何种植RNG以最大化空间/时间的唯一性?我需要强大一个RNG?

我并不是特别追求效率(达到一定程度),但我真的希望确保概率能够实现他们的承诺!

1 个答案:

答案 0 :(得分:2)

使用快速128位加密哈希(如md5)对计数器进行哈希处理,然后将其拆分为两个。这将给你“随机”,独立的值,每个64位,它应该是非常有效的。

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

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