UUID在不同系统中是否独一无二?

时间:2011-04-09 02:05:14

标签: uuid

我想知道UUID是否是唯一的,即使它们是在不同的系统上生成的,这些系统可能采用不同的算法。例如,如果你在MySQL和.Net中生成了一堆UUID,是否会有更高的冲突机会,或者所有系统都使用完全相同的算法,从而保证冲突是不可能的?

4 个答案:

答案 0 :(得分:6)

维基百科上的Universally unique identifier: ......这个词的独特之处应该是“实际上独一无二”,而不是“保证独特”。由于标识符具有有限的大小,因此两个不同的项可以共享相同的标识符。需要选择标识符大小和生成过程,以使这几乎不可能。

答案 1 :(得分:2)

UUID应该包含一个时间戳和一个版本号,但其余部分应该是随机的,所以除非你确定UUID是在不同的时间生成的,否则无论发生器是什么都会产生相同的碰撞机会软件。较早版本的生成算法包括MAC地址,这有助于MAC地址冲突风险。这都在RFC 4122中指定。

答案 2 :(得分:2)

不,它可以变化。基本上,碰撞的可能性取决于UUID生成方法中 entropy (=“true”不可预测性)的数量。

(a)UUID有不同的标准格式,每种格式本身都有不同数量的熵(例如,如果你将你的UUID基于Mac和时间戳,这原则上比将UUID简单地放在字符串上的熵更少随机位)

(b)对于类型4,基于随机比特,没有标准的随机数生成算法/标准熵源。

如果你有一个“完美”的随机数生成器,那么一个随机的UUID有2 ^ 116个可能的值(12个版本浪费在版本标记上等),换句话说你会期望生成大约2 ^ 56或7x10 ^在发生碰撞之前有16个UUID。

答案 3 :(得分:2)

鉴于128位,有可能的UUID有340,282,366,920,938,463,463,374,607,431,768,211,456。理论上说,这应该足以使它们具有普遍的独特性 - 所以对你的问题的简短答案是肯定的,即使不同的系统使用其他版本的算法。

查看维基文章中的表格,了解碰撞概率。