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)。
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
UUID 的应用场景
UUID 的数据类型是字符串,凭借其高性能、本地生成的特性,非常适合做 request_id、trace_id。
Go 项目使用 UUID
Go 项目可以使用 github.com/google/uuid 库来生成 UUID。
Mac 终端生成 UUID
在终端输入 uuidgen 命令即可。
Buy me a coffee~
支付宝
微信