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


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


1173
2018-04-09 02:05


起源



答案:


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


6
2018-04-09 02:11





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


2
2018-04-09 02:12





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

请查看维基文章中的表格,以便更好地了解碰撞概率。


2
2018-04-09 02:20





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

(a)UUID有不同的标准格式,每个UUID本身都有不同的熵量(例如,如果你将你的UUID基于Mac和时间戳,这原则上比仅仅基于一串随机比特的UUID具有更少的熵)

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

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


2
2018-04-09 02:17



对,进一步阅读, 生日悖论 是一个很好的例子,有助于解释如何发生碰撞。 - mikegradek


答案:


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


6
2018-04-09 02:11





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


2
2018-04-09 02:12





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

请查看维基文章中的表格,以便更好地了解碰撞概率。


2
2018-04-09 02:20





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

(a)UUID有不同的标准格式,每个UUID本身都有不同的熵量(例如,如果你将你的UUID基于Mac和时间戳,这原则上比仅仅基于一串随机比特的UUID具有更少的熵)

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

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


2
2018-04-09 02:17



对,进一步阅读, 生日悖论 是一个很好的例子,有助于解释如何发生碰撞。 - mikegradek