随机数或UUID的Xor

时间:2015-02-24 06:40:42

标签: c++ algorithm random

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

如果我复制某些实体,我需要为副本生成新的UUID(因为否则某些实体会有重复的UUID)。但是更新UUID需要更新实体之间的链接。所以我正在考虑对所有UUID进行统一更改:在复制实体之前,我将生成一些LoadingUUID并使用公式更新所有UUID:

NewEntityID = EntityID xor LoadingUUID

问题是:两个UUID的xor会大幅增加冲突UUID的可能性吗?

2 个答案:

答案 0 :(得分:2)

如果两个UUID具有按位相关性,则是,将它们放在一起会增加碰撞的概率。

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

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

答案 1 :(得分:0)

在评论中发布 harold 来自相同二次幂范围且具有均匀分布的两个随机数的XOR将再次是在相同范围内具有均匀分布的随机数。

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