Random 如何生成唯一的64位密钥

Random 如何生成唯一的64位密钥,random,unique-key,Random,Unique Key,我想生成唯一的64位密钥(伪随机),以识别模型中的对象。我需要密钥在系统的所有用户中尽可能地唯一(将任意N个密钥一起使用时发生冲突的概率降至最低) 因为我们的数据便宜,所以现在不可能使用普通的guid:)。因为我预计在同一上下文中使用的密钥不会超过100万个,所以我认为64位就足够了(冲突概率约为10e-7) 作为旁注,我还需要一个方案将这些密钥的元组折叠/散列为一个64位密钥,该密钥也需要分布良好/唯一 既然我需要一个好的(分布良好的)散列函数,那么将一个GUID对折(可能以某种方式考虑GUI

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

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

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

既然我需要一个好的(分布良好的)散列函数,那么将一个GUID对折(可能以某种方式考虑GUID中的固定位)可以吗?还是使用本地RNG更好?我将如何播种RNG以最大限度地实现跨时空的独特性?我需要多大强度的RNG


我并不是特别追求效率(在某种程度上),但我真的很想确保概率能够兑现承诺

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

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


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

我们目前有一个服务器,它分发32位密钥的范围,以确保唯一性,但使用这种简单的计数器正是我试图避免的(单点故障、连接问题)。通过这种方式,您可以拥有许多独立的“计数器”,因为每个MD5为您提供两个。或者为不同的源提供前缀。一旦你使用散列,选择是无止境的。例如,每台机器可以散列它的MAC地址加上一个计数器,等等。更新答案。那么,md5本地计数器+识别机器的东西?与使用RNG(Mersenne twister等)相比,这将如何?prng可能会稍微快一点,但您需要更多地担心实现——它需要有足够的状态和足够长的时间。散列已经具有作为简单保证所需的属性,而不需要确切地研究它们是如何实现的。