一个通用唯一识别码(UUID,Universally Unique Identifier 的缩写) 是一种用于计算机系统中唯一标识信息的128位标签。UUIDs设计为在时间和空间上都是独一无二的,可以独立生成,无需依赖中央权威机构,从而大大减少了重复的风险。
UUIDs 用于多种用途,包括:
- 在数据库中识别记录。
- 在分布式系统中给对象打标签。
- 在需要唯一性的应用程序中作为主键。
- 数据库:在关系数据库中,UUID被用作主键,以确保记录的唯一标识。
- 微服务:通过为请求和资源提供唯一标识来促进服务间的通信。
- 物联网设备:在网络中唯一标识物联网设备,确保来自不同源头的数据能够顺利聚合。
优点:
- 具有全局唯一性:UUID几乎不会发生冲突,适用于多个节点独立生成标识符的分布式系统。
- 不需要中央权威机构:它们可以在无需协调的情况下生成,简化了分布式环境中的操作。
- 可扩展性:它们在需要跨越多个服务器或服务扩展的系统中表现良好。
缺点:
- 存储大小:与传统的整数ID(通常为32位)相比,UUID占用更多的存储空间(128位),这可能导致存储成本增加。
- 性能问题:由于UUID的随机性和大小,索引UUID可能会降低数据库性能,导致查询时间比顺序ID慢。
- 用户不友好:在用户界面中显示时,UUID不易记忆且不够用户友好。
UUID的标准表示形式由32个十六进制字符构成,分为五组,每组之间用短横线隔开,格式为8-4-4-4-12
,总共包括36个字符(32个字母数字字符和4个短横线)。
UUID通常如下所示:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
全屏,退出
如下:
- M 指的是 UUID 版本号。
- N 指的是变种,帮助理解 UUID 的结构。
UUID (UUID的组成部分)
- TimeLow(时间低位) :4字节(8个十六进制字符),表示时间戳的低位字段。
- TimeMid(时间中位) :2字节(4个十六进制字符),表示时间戳的中间字段。
- TimeHighAndVersion(时间高位和版本) :2字节(4个十六进制字符),包括版本号和时间戳的高位字段。
- ClockSequence(时钟序列) :2字节(4个十六进制字符),用于帮助避免碰撞,特别是在快速生成多个UUID时,或者当系统时钟调整时。
- Node(节点) :6字节(12个十六进制字符),通常表示生成节点的MAC地址(如网络接口卡的地址)。
UUID的种类
-
版本 1:使用时间戳和生成节点的 MAC 地址生成的 UUID。这个版本确保在时间和空间上的唯一性。
-
版本 2:与版本 1 类似,但包含本地域名标识符;不过,但由于它的限制,它用得较少。
-
版本 3:通过命名空间标识符和名称的 MD5 哈希生成的基于名称的 UUIDs,如下所示。
-
版本 4:这种 UUID 是随机生成的,具有高随机性和唯一性,其中仅少量位用于版本信息。
- 版本 5 :类似于版本 3,但是使用 SHA-1 哈希算法进行哈希计算,因此比版本 3 更加安全。
不同的版本
UUID中的变体决定了其布局和含义。常见的几种变体有:比如说,
- Variant 0 : 用于NCS向后兼容的保留。
- Variant 1 : 最常用的标准布局,用于大多数UUID。
- Variant 2 : 用于较少见的DCE安全UUID的布局。
- Variant 3 : 保留用于将来的定义。
例子
在版本 4中,一个 UUID 可能看起来像下面这样:
550e8400-e29b-41d4-a716-446655440000
全屏模式 退出全屏
HERE:
这里:
41d4
表示它是版本 4。a7
代表变体,这里指的是常见的 "Leach-Salz" 变体。
UUIDs如何生成
- 第一版(时间版):
- 时间戳通常是从1582年10月15日(格里高利历改革日期)开始计算的,以100纳秒为单位的间隔数。
- 节点是指生成UUID的机器的MAC地址。
-
时钟序列有助于在时间变化(比如系统重启)时确保唯一性。
- 版本3和版本5(基于名称) :
- 命名空间(比如DNS域)会被结合到名称(比如文件路径或URL)上,并进行哈希处理。
-
然后,根据版本的不同,哈希值(版本3使用MD5,版本5使用SHA-1)会被转换为UUID格式,确保版本和变体被正确设置。
- 版本4(随机生成) :
- UUID的122位则由随机或伪随机数生成。
- 版本和变体字段会根据UUID标准进行设置,确保符合标准。
UUIDv4 示例
步骤 1 为:生成 128 个随机位
我们假设生成如下的128位的随机数。
11001100110101101101010101111010101110110110111001011101010110110101111011010011011110100100101111001011
步骤二 :应用 UUIDv4
-
版本:将位12到15(第4个字符)改为
0100
(用于UUID版本4)。
原来的1100
变为0100
,变为0100
。 - 变体:将第9个字节的第6和第7位替换为
10
(用于RFC 4122变体规范)。
原始值为11
,现在变为了10
→ 该位置的值现在更新为。
第三步 :转换成十六进制
把128位的二进制数转换成五个十六进制组:
- 32位组:
11001100110101101101010101111010
→ccda55ba
- 16位组:
1011101101101110
→b76e
- 16位组:
0100010101000101
→4545
(版本4的0100
) - 16位组:
1010110111110010
→adf2
(变体10
) - 48位组:
11010011011110100100101111001011
→d39d25cb
第四步:合并这些组
最终的UUID是这样的:
ccda55ba-b76e-4545-adf2-d39d25cb
共同学习,写下你的评论
评论加载中...
作者其他优质文章