UUID(Universally Unique Identifier)也称为GUID(Globally Unique Identifier),是一个128比特位的数字。它用于唯一的标示一段信息。
UUID的唯一性保障机制与其它一般的编号方案不同,它的唯一性不依赖于一个中心化的注册机构,也不需要在多个UUID生成器之间做协调。
理论上,UUID是有可能重复的。但是在实际合适的应用场景中,其重复几率低到可以忽略。
UUID的历史
UUID最初被应用于NCS(Apollo Network Computing System)。
之后又被应用到OSF(Open Software Foundation)的DCE(Distributed Computing Environment)。
DCE UUID 的设计是基于 NCS UUID 的。而NCS UUID的设计则受到了在 Domain/OS 中广泛应用的64比特位唯一标识符的启发。
后来微软Windows平台中的GUID采用了DCE的设计。
RFC 4122 为UUID注册了一个URN命名空间,并概述了UUID早期的规范。
RFC 4122被公布为IETF标准时,ITU 也基于先前的标准和RFC 4122的早期规范对UUID作了标准化。
UUID的格式
UUID的文本表达式含有32个十六进制数,它们被分为5个部分,用连字符(-)拼接。如:
123e4567-e89b-12d3-a456-426655440000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
M的大小是4个比特位,它表示UUID的版本。N的前1到3个比特位表示UUID的变量。
“8-4-4-4-12”UUID文本表达式中的字段含义
注:
这些字段的划分方式与version1和version2的UUID相符合,它们都是基于时间的UUID。
但是8-4-4-4-12这个表达形式是所有版本的UUID所通用的(即使其构建方式不同)。
在不同应用场景中,UUID的具体展现形式会稍有不同,但主体内容大致相同。如:
{123e4567-e89b-12d3-a456-426655440000}
urn:uuid:123e4567-e89b-12d3-a456-426655440000
UUID的版本
不同版本的UUID,其适用场景也不同。
version1:基于时间和节点ID。节点ID通常是MAC地址
因为mac地址和系统当前时间都不是什么秘密信息。所以根据某机器产生的UUID,可能预测到未来时间点可以生成的UUID。所以该版本被认为有安全问题。
《UUID version1 安全问题》
version2:基于一个标识符、时间和节点ID。标识符可以是某个组或用户的ID
算法与 version1 相同,但会把时间戳的前4位换为 POSIX 的 UID 或 GID。
该版本是DCE安全的(Distributed Computing Environment)
version3 和 version5:基于某个特定的hash算法对一个命名空间和名字进行hash
version3使用的是MD5算法,version5使用的是SHA1算法。
这两个版本的UUID:
命名空间和名字都相同时生成的UUID是相同的;
但只要其中一项或两项都不同则生成的UUID也不同。
RFC 4122 建议这两个版本中选择version5,且不建议version3或version5的UUID作为安全凭证。
version4:基于一个随机数(或伪随机数)
- MySQL UUID()方法采用的是version1
- Java中的 java.util.UUID 类提供了实现version3和version4(伪随机数)UUID的方法
- version3:nameUUIDFromBytes
- version4:randomUUID
其它
Wikipedia:《UUID》
知乎:《UUID是如何保证唯一性的?》