速看! 今天我才知道,UUID 还分五个版本
通用唯一识别码(英语:Universally Unique Identifier,缩写:UUID)是用于计算机[1]体系中以识别信息数目的一个 128 位标识符,还有相关的术语:全局唯一标识符[2](GUID
)。
根据标准方法生成,不依赖中央机构[3]的注册[4]和分配[5],UUID
具有唯一性,这与其他大多数编号[6]方案不同。重复UUID
码概率接近零,可以忽略不计。
UUID
是由一组 32 位数的 16 进制数字所构成,故UUID
理论上的总数为 16^32=2^128,约等于 3.4 x 10^38。也就是说若每纳秒[7](ns)产生 1万亿[8]个 UUID,要花 100 亿年才会将所有 UUID 用完。
UUID
的标准型式包含 32 个16 进制[9]数字,以连字号[10]分为五段,形式为 8-4-4-4-12
的 32 个字符。
示例:550e8400-e29b-41d4-a716-446655440000
UUID 格式:
在其规范的文本表示中,UUID
的 16 个 8 位字节表示为 32 个十六进制(基数 16)数字,显示在由连字符分隔 '-' 的五个组中,"8-4-4-4-12" 总共 36 个字符(32 个字母数字字符和 4 个连字符)。例如:
ounter(line
ounter(line
ps:上下对比看,a 在十六进制中表示 10
四位数字 M
表示 UUID
版本,数字 N
的一至三个最高有效位表示 UUID
变体。在例子中,M 是 1
而且 N 是 a
(10xx
),这意味着此 UUID 是“变体 1”、“版本 1”UUID;即基于时间的 DCE/RFC 4122 UUID
。
UUID 版本:
对于“变体(variants)1”和“变体 2”,标准中定义了五个版本(versions),并且在特定用例中每个版本可能比其他版本更合适。
版本由 M 字符串中指示。
版本 1 - UUID 是根据时间和节点 ID(通常是 MAC 地址)生成;
版本 2 - UUID 是根据标识符(通常是组或用户 ID)、时间和节点 ID 生成;
版本 3、版本 5 - 确定性 UUID 通过散列(hashing)名字空间(namespace)标识符和名称生成;
版本 4 - UUID 使用随机性[11]或伪随机性[12]生成。
Java 中生成 UUID:
下面让我们介绍一下 Java UUID
类中可以用来生成 UUID
的方法:
1. randomUUID():
它使用加密强度高的伪随机数生成器生成 v4 伪随机UUID
:
UUID uuid = UUID.randomUUID();
2. nameUUIDFromBytes():
我们可以使用 nameuidfrombytes ()
从字节数组生成 UUID
:
byte[] byteArr = {11, 23, 33};
UUID uuid = UUID.nameUUIDFromBytes(byteArr);
此方法生成 v3 UUID (基于名称的)。
3. fromString():
使用 fromString ()
,我们可以从一个标准的字符串表示创建 UUID
:
UUID uuid = UUID.fromString(
"533a4559-e55c-18b3-2456-555563322002"
);
对于作为参数传入的任何无效字符串,它将抛出 IllegalArgumentException
。
比较两个 uuid:
Java UUID
实现了 Comparable
接口,因此,我们可以使用 compareTo ()
方法来比较它们
ounter(line
ounter(line
ounter(line
ounter(line
如我们所知,compareTo ()
方法返回:
1: 如果 uuid1 大于 uuid2
0:如果 uuid1=uuid2
-1: 如果 uuid1 小于 uuid2
我们也可以选择使用 equals ()
方法进行比较。
总结:
在本教程中,我们了解了 UUID
是什么及其格式和版本。我们还介绍了由 java UUID
类中生成uuid
的方法。
关于作者
大家好,我是麦叔,目前从事Java开发,前端和后端略懂一点。希望喜欢我的伙伴关注我的个人公众号,方便获取一手文章信息。当然也可以加我个人微信(下方右侧),大家交个朋友,谢谢大家对我的支持。
版权声明: 本文为 InfoQ 作者【麦叔】的原创文章。
原文链接:【http://xie.infoq.cn/article/755b99ade36c154554742d858】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论