为了账号安全,请及时绑定邮箱和手机立即绑定

你需要知道的一切关于UUID的信息

一个通用唯一识别码(UUID,Universally Unique Identifier 的缩写) 是一种用于计算机系统中唯一标识信息的128位标签。UUIDs设计为在时间和空间上都是独一无二的,可以独立生成,无需依赖中央权威机构,从而大大减少了重复的风险。

UUIDs 用于多种用途,包括:

  • 在数据库中识别记录。
  • 在分布式系统中给对象打标签。
  • 在需要唯一性的应用程序中作为主键。
实际应用案例
  • 数据库:在关系数据库中,UUID被用作主键,以确保记录的唯一标识。
  • 微服务:通过为请求和资源提供唯一标识来促进服务间的通信。
  • 物联网设备:在网络中唯一标识物联网设备,确保来自不同源头的数据能够顺利聚合。
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的组成部分)

  1. TimeLow(时间低位) :4字节(8个十六进制字符),表示时间戳的低位字段。
  2. TimeMid(时间中位) :2字节(4个十六进制字符),表示时间戳的中间字段。
  3. TimeHighAndVersion(时间高位和版本) :2字节(4个十六进制字符),包括版本号和时间戳的高位字段。
  4. ClockSequence(时钟序列) :2字节(4个十六进制字符),用于帮助避免碰撞,特别是在快速生成多个UUID时,或者当系统时钟调整时。
  5. Node(节点) :6字节(12个十六进制字符),通常表示生成节点的MAC地址(如网络接口卡的地址)。

UUID的种类

  1. 版本 1:使用时间戳和生成节点的 MAC 地址生成的 UUID。这个版本确保在时间和空间上的唯一性。

  2. 版本 2:与版本 1 类似,但包含本地域名标识符;不过,但由于它的限制,它用得较少。

  3. 版本 3:通过命名空间标识符和名称的 MD5 哈希生成的基于名称的 UUIDs,如下所示。

  4. 版本 4:这种 UUID 是随机生成的,具有高随机性和唯一性,其中仅少量位用于版本信息。

  5. 版本 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如何生成

  1. 第一版(时间版)
  • 时间戳通常是从1582年10月15日(格里高利历改革日期)开始计算的,以100纳秒为单位的间隔数。
  • 节点是指生成UUID的机器的MAC地址。
  • 时钟序列有助于在时间变化(比如系统重启)时确保唯一性。

    1. 版本3和版本5(基于名称)
  • 命名空间(比如DNS域)会被结合到名称(比如文件路径或URL)上,并进行哈希处理。
  • 然后,根据版本的不同,哈希值(版本3使用MD5,版本5使用SHA-1)会被转换为UUID格式,确保版本和变体被正确设置。

    1. 版本4(随机生成)
  • UUID的122位则由随机或伪随机数生成。
  • 版本和变体字段会根据UUID标准进行设置,确保符合标准。

UUIDv4 示例

步骤 1 为:生成 128 个随机位

我们假设生成如下的128位的随机数。

11001100110101101101010101111010101110110110111001011101010110110101111011010011011110100100101111001011

步骤二 :应用 UUIDv4

  1. 版本:将位12到15(第4个字符)改为0100(用于UUID版本4)。
    原来的1100变为0100,变为0100

  2. 变体:将第9个字节的第6和第7位替换为10(用于RFC 4122变体规范)。
    原始值为11,现在变为了10 → 该位置的值现在更新为。

第三步 :转换成十六进制

把128位的二进制数转换成五个十六进制组:

  1. 32位组:11001100110101101101010101111010ccda55ba
  2. 16位组:1011101101101110b76e
  3. 16位组:01000101010001014545(版本4的0100
  4. 16位组:1010110111110010adf2(变体10
  5. 48位组:11010011011110100100101111001011d39d25cb

第四步:合并这些组

最终的UUID是这样的:
ccda55ba-b76e-4545-adf2-d39d25cb

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消