UUID 的原理、特性、应用场景与使用方式

警告
本文最后更新于 2023-02-21,文中内容可能已过时。

认识UUID

UUID是 16 字节 128 位长的数字,通常以 36 字节的字符串表示,示例如下:

3F2504E0-4F89-11D3-9A0C-0305E82C3301(其中的字母是16进制表示,大小写不敏感)

  • 时间戳+UUID版本号,分三段占前16个字符(60bit+4bit),
  • Clock Sequence号与保留字段,占4个字符(13bit+3bit),
  • 节点标识占后12个字符(48bit)。

/id_generator/uuid/1.png

UUID 会耗尽吗

UUID 是一个 128 比特的数字,意味着 UUID 的总数量为 $2^{128}$ 个,如果每纳秒产生 1 兆个不相同的 UUID,需要花费超过 100 亿年才会用完所有的 UUID。

UUID 性能如何

UUID 不需要集中式管理,单机即可生成 UUID 不需要其他依赖,并且每台机器每秒钟可以生成超过 1000 万个 UUID。

UUID 会重复吗

UUID 的总量虽然巨大,但是如果不停地使用,假设每纳秒生成超过 1 兆个 UUID 并且人类有幸能够繁衍到 100 亿年以后,总会有可能产生重复的 UUID。

那么,怎么计算 UUID 的碰撞几率呢?这是一个数学问题,可以使用比较著名的生日悖论解决,感兴趣的可以看下图的证明过程,这里直接放结论了:

  • 103 万亿个 UUID 中找到重复项的概率是十亿分之一
  • 要生成一个冲突率达到 50% 的 UUID 至少需要生成 $2.71 * 1000000^3$ 个 UUID

/id_generator/uuid/2.png

UUID 的应用场景

UUID 的数据类型是字符串,凭借其高性能、本地生成的特性,非常适合做 request_id、trace_id。

Go 项目使用 UUID

Go 项目可以使用 github.com/google/uuid 库来生成 UUID。

Mac 终端生成 UUID

在终端输入 uuidgen 命令即可。

Buy me a coffee~
室长 支付宝支付宝
室长 微信微信
0%