在分布式系统设计中,生成全局唯一的 ID 是最基础的需求。多年来,UUID (Universally Unique Identifier) 一直是事实上的标准。

但随着数据量的爆炸,UUID 在数据库性能上的短板逐渐暴露,而 ULID (Universally Unique Lexicographically Sortable Identifier) 作为后起之秀,正在被越来越多的新项目采用。

本文将深入对比两者的优劣,帮你决定谁才是你的“真命天子”。

UUID:老当益壮的标准

UUID (v4) 是由 32 个十六进制数字组成的字符串,通常用连字符分为五组。

优点

  1. 绝对标准:几乎所有编程语言和数据库都内置支持。
  2. 安全性:v4 版本完全随机,无法从中推测出生成时间或机器信息。

缺点

  1. 无序性(致命伤):UUID v4 是完全随机的。如果用作数据库主键(Primary Key),每次插入数据都会导致 B+ 树索引的大量随机 IO 和页分裂,严重拖慢写入性能。
  2. 体积大:128 位,通常以 36 字符的字符串存储,浪费空间。

ULID:为数据库而生

ULID 设计之初就是为了解决 UUID 的无序问题。它由 26 个字符组成(Base32 编码)。

结构揭秘

ULID = 48位时间戳 + 80位随机数

优点

  1. 按字典序排序:这是它最大的杀手锏。由于前 48 位是时间戳,生成的 ID 是单调递增的。这使得数据库在插入新数据时,只需要在索引树的末尾追加,极大提升了写入性能。
  2. 不包含连字符:URL 安全,且比 UUID 短(26 vs 36 字符)。
  3. 兼容性:本质上依然是 128 位,可以无缝转换成 UUID 格式存储。

选型建议

维度UUID (v4)ULID
有序性无序 (Random)有序 (Sorted)
索引性能差 (随机 IO)优 (顺序 IO)
安全性高 (不暴露时间)中 (暴露生成时间)
长度36 字符26 字符

动手试一试

  • 👉 生成一个标准的 UUID
  • 👉 生成一个可排序的 ULID

版权声明

作者: Hugo Narrow

链接: https://blog.888467.xyz/posts/uuid-vs-ulid-guide/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键