UUIDv7的20种语言实现

💡 原文中文,约15300字,阅读约需37分钟。
📝

内容提要

UUIDv7是一个128位的唯一标识符,可以按时间排序,精度为1毫秒。它由时间戳、随机部分和版本号组成。本文介绍了20种语言的UUIDv7实现方法,包括JavaScript、Python、SQL、Shell、Java、C#、C++、C、PHP、Go、Rust、Kotlin、Ruby、Lua、Swift等。每种语言都使用不同的方法来生成随机字节、获取时间戳,并将它们填充到数组中,然后设置版本和变量。

🔎

延伸解读

UUIDv7 的结构与排序优势

UUIDv7 是一个 128 位标识符,由 48 位毫秒级 Unix 时间戳、4 位版本号、12 位随机数 rand_a、2 位变体以及 62 位随机数 rand_b 组成。由于时间戳位于最高位,生成的 UUID 按字典序排序即等同于按生成时间排序,精度为 1 毫秒。这使得 UUIDv7 非常适合作为数据库(尤其是分布式数据库)的主键,能提升索引效率并避免 UUIDv4 完全随机导致的插入性能问题。

跨语言实现的核心步骤

文章展示了 20 种语言的零依赖实现,虽然语法各异,但核心步骤一致:首先生成 16 字节随机数组,然后获取当前毫秒级时间戳,接着将时间戳的 48 位填充到数组的前 6 个字节,最后设置版本和变体——将第 7 字节的高 4 位设为 0x7,第 9 字节的高 2 位设为 0b10。不同语言主要区别在于随机数生成函数(如 crypto.getRandomValues、os.urandom、SecureRandom)和时间戳获取方式(如 Date.now、time.time、System.currentTimeMillis

实现时的注意事项

在自行实现 UUIDv7 时,需确保时间戳为毫秒级 Unix 时间,并正确填充到前 6 字节。版本和变体的设置必须通过位运算完成,避免覆盖随机位。此外,随机部分应使用密码学安全的随机源,如 JavaScript 的 crypto.getRandomValues、Python 的 os.urandom、Java 的 SecureRandom 等,以保证唯一性和不可预测性。对于 SQL 和 Shell 等环境,需注意时间戳精度和随机函数的可用性,例如 SQLite 使用 strftime 获取秒级时间戳后需转换为毫秒。

❓

Q&A

UUIDv7的结构是什么样的?

UUIDv7由48位时间戳、4位版本号、12位随机部分和62位随机生成部分组成。

如何在JavaScript中生成UUIDv7?

JavaScript使用crypto.getRandomValues()生成随机字节,使用Date.now()获取时间戳,并填充到数组中设置版本和变量。

UUIDv7的主要优点是什么?

UUIDv7可以按时间排序,精度为1毫秒,适合用作数据库中的记录标识符。

Python中如何实现UUIDv7?

Python使用os.urandom()生成随机字节,使用time.time()获取当前时间戳,并填充到数组中设置版本和变量。

UUIDv7与UUIDv4有什么区别?

UUIDv7可以按时间排序,而UUIDv4是随机生成的,无法按时间排序。

在SQL中如何生成UUIDv7?

SQL使用strftime()或now()获取时间戳,使用random()生成随机部分,然后将它们连接成UUID字符串。

➡️

继续阅读