主要观点:介绍了 UUIDv7 这一 128 位唯一标识符,它像 UUIDv4 等前辈一样,具有时间可排序(1 毫秒精度)的特点,是数据库(包括分布式数据库)中记录标识符的优秀选择。提供了 33 种语言的零依赖实现代码,并详细说明了 UUIDv7 的结构及各部分含义,最后提到了相关规范的发布时间及对其的期望。
关键信息:
- UUIDv7 结构:由 48 位时间戳(毫秒级 Unix 时间戳)、4 位版本号(7)、12 位随机数(rand_a)、2 位固定变体(10)、62 位随机数(rand_b)组成。
- 33 种语言实现:包括 JavaScript、Python、SQL、Shell、Java、C#、C++、C、PHP、PowerShell、Go、Rust、Kotlin、Ruby、Lua、Dart、Swift、R、Pascal、Perl、Elixir、Clojure、Julia、Erlang、Zig、Crystal、Nim、Gleam、Tcl、V、Emacs Lisp、Vimscript、Nushell 等,各语言实现方式不同但原理相似。
- 相关规范:RFC 9652 规定了 UUIDv7 的细节,RFC 4122 于 2005 年发布,UUIDv7 是对时间有序 UUID 的标准更新。
重要细节: - JavaScript 实现通过
crypto.getRandomValues()
获取随机数,Date.now()
获取当前时间戳来填充 UUID 数组。 - Python 利用
os.urandom()
获取随机数,time.time()
获取当前时间戳。 - SQL 在不同数据库(如 SQLite、PostgreSQL、SQL Server)中有不同的实现方式,通过相应函数获取时间戳和随机数并拼接。
- Shell 脚本通过
/dev/urandom
获取随机数,date
获取当前时间戳。 - Java 使用
SecureRandom.nextBytes()
和System.currentTimeMillis()
。 - C#借助
RandomNumberGenerator.GetBytes()
和DateTimeOffset.UtcNow
。 - C 语言通过
getentropy()
获取随机数,timespec_get()
获取时间戳。 - PHP 利用
random_bytes()
和microtime()
。 - PowerShell 使用
Random.GetBytes()
和DateTimeOffset.UtcNow
。 - Go 以
rand.Read()
获取随机数,time.Now()
获取时间戳。 - Rust 通过
getrandom::getrandom()
和SystemTime::now()
。 - Kotlin 借助
SecureRandom.nextBytes()
和Instant.now()
。 - Ruby 使用
SecureRandom.random_bytes()
和Time.now
。 - Lua 生成随机表,通过
os.time()
获取时间戳。 - Dart 利用
Random.secure()
和DateTime.now()
。 - Swift 扩展
UUID
类型,通过UInt8.random()
获取随机数,Date().timeIntervalSince1970
获取时间戳。 - R 语言使用
sample()
和Sys.time()
。 - Pascal 通过
Random()
和DateTimeToUnix()
。 - Perl 利用
rand()
和Time::HiRes::time()
。 - Elixir 借助
crypto.strong_rand_bytes()
和os.system_time()
。 - Clojure 使用
SecureRandom.nextBytes()
和System.currentTimeMillis()
。 - Julia 通过
rand()
和time()
。 - Erlang 生成随机字节,通过
os:system_time()
获取时间戳。 - Zig 利用
std.crypto.random.bytes()
和std.time.milliTimestamp()
。 - Crystal 初始化随机切片,通过
Time.utc
获取时间戳。 - Nim 通过
random.rand()
和times.epochTime()
。 - Gleam 初始化随机位数组,通过
crypto.strong_rand_bytes()
和os.system_time()
。 - Tcl 生成随机数组,通过
rand()
和clock milliseconds
获取时间戳。 - V 语言利用
rand.bytes()
和time.now()
。 - Emacs Lisp 通过
random
和current-time
获取随机数和时间戳。 - Vimscript 通过
rand
和localtime
获取随机数和时间戳。 - Nushell 生成随机字节,通过
date now
获取时间戳。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。