2015-02-24 62 views
2

我正在开发数据结构,其中每个实体应具有唯一标识符。我正在考虑使用64位随机数或Boost UUID http://www.boost.org/doc/libs/1_57_0/libs/uuid/Xor的随机数字或UUID

如果我拷贝一些实体,我需要为拷贝新的UUID生成拷贝(因为否则有些实体会有重复的UUID)。但更新UUID需要更新实体之间的链接。所以我想统一更改为所有UUID的:前实体的复制,我会产生一些LoadingUUID和使用公式更新所有的UUID:

NewEntityID = EntityID xor LoadingUUID 

的问题是:将异或XOR两个的UUID的大幅增加冲突的可能性UUID的?

+1

此外,如果您使用相同数字(或考虑复制副本)两次使用某个编号,您将获得原始编号。 – Cthulhu 2015-02-24 06:51:09

+0

是的!但正如你所看到的,我不会使用相同的LoadUUID两次 – Rem 2015-02-24 06:51:54

+0

@Rem我们怎么看? Cthulhu警告说,在'NewEntityID = EntityID xor LoadingUUID'后,另一个副本给出'NewNewEntityID = NewEntityID xor LoadingUUID',它等于'(EntityId xor LoadingUUID)xor LoadingUUID',简化为'EntityId' - a碰撞。另外,如果这不是问题,'NewEntityID =〜EntityID'可能不会碰到'LoadingUUID'的任何非全部位设置值。也就是说,不是“更新链接”的正确方法是狡猾和骇人听闻,可能会更好地避免。 – 2015-02-24 07:09:16

回答

2

如果两个UUID具有按位相关,那么将它们异或会增加碰撞概率。

编辑:两个独立的UUID生成器可能没有按位相关性,但很难确切知道,在创建UUID生成器时它不会是任何人的设计或测试目标。如果他们没有相关性,那么我认为碰撞概率不会增加。

相反,单个UUID生成器可能在其UUID结果之间具有按位相关性。例如。它可能会将某些位分配给时间戳。

+0

我不认为UUID生成器生成具有按位相关的UUID – Rem 2015-02-24 06:52:52

0

作为哈罗德已发表评论来自同一幂分布均匀分布的两个随机数的XOR将再次成为在同一范围内具有均匀分布的随机数。

我已经用int64_t作为UUID和std :: mt19937_64作为UUID生成器进行了测试,并使用随机ID生成100.000个唯一ID并对它们进行100次异或(导致总共1000万个ID)。这个测试我运行了十几次,并且这种方案没有产生重复。这对我的需求来说已经足够了。 (实体数量低于10-20k)

+1

UUID不仅仅是随机生成的,例如,他们会从您的PC中获取您的MAC地址以及其他硬件ID,以减少与其他地方产生冲突的机会。 – 2015-02-24 10:01:30