🔀

【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でも生成したいと思います。

main.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