【Go】PostgreSQL 18でUUID v7を生成できるようになったので、PostgreSQLとGoで生成してみた。
はじめに
2025年9月25日、PostgreSQL 18.0がリリースされました。
様々な機能が追加されましたが、今回はその中でもUUID v7生成に焦点を当てて見ていこうと思います!
この記事でわかること
- UUID v7の概要
- PostgreSQL 18.0でのUUID v7の生成方法
- GoでのUUID v7の生成方法
UUID v7について
UUIDには様々なバージョンがありますが、v7は「時間+ランダム値ベース」のUUIDといえます。
RFC9562では、128ビットのうち以下のような構成でUUID v7は成り立っていることが説明されています。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unix_ts_ms |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unix_ts_ms | ver | rand_a |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| rand_b |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| rand_b |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
構成要素については以下の通りです。
| フィールド名 | 意味 | ビット数 |
|---|---|---|
unix_ts_ms |
ミリ秒を含むUNIX時間 | 48ビット |
ver |
UUIDのバージョン | 4ビット |
var |
バリアント | 2ビット |
rand_a |
ランダム値A | 12ビット |
rand_b |
ランダム値B | 62ビット |
最初の48ビットが時間ベースで生成されているため、生成順にソートできるのが特徴です。また、ランダム性も備えているので、UUIDの衝突可能性を下げる効果もあります。
UUID v7の用途としては、「DBの主キー」や「イベントログID」などが考えられます。
PostgreSQL 18.0で生成してみた
冒頭にも書いた通り、PostgreSQL 18.0では標準関数でUUID v7を生成することができました。
uuidv7()で生成が可能です。(uuidv4()と似たように生成できますね!)
# select uuidv7();
uuidv7
--------------------------------------
019a305f-00df-71de-8881-302439bc0105
(1 row)
文字列にすると36文字となり、「xxxxxxxx-xxxx-7xxx-xxxx-xxxxxxxxxxxx」 という形式になります。「7」はバージョン7であることを表しています。
Goでも生成してみた
せっかくなので、Goでも生成したいと思います。
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
uuid, _ := uuid.NewV7()
fmt.Println("UUID v7: ", uuid)
}
GoではuuidパッケージのNewV7()という関数を使うことで生成することができます。
実行すると、以下のように標準出力されます。
# go run main.go
UUID v7: 019a3064-e962-7461-bb91-4a200aa76f6c
PostgreSQL同様、v7のUUIDを生成することができました!
まとめ
今回は、UUID v7の概要と、PostgreSQL 18.0ならびにGoでの生成方法をみていきました。
PostgreSQLの場合はuuidv7()を、Goの場合はuuidパッケージのNewV7()という関数を使うことで生成することができます。
Discussion