UUID バージョン7 ジェネレーター
UUIDv7 • 時系列ソート対応 (RFC 9562)
00000000-0000-0000-0000-000000000000
囲み文字:
UUID一括バッチ生成
0 msReady
最大 5,000件
フォーマットと構造設定
準備完了
No batch active1-click copy available on each row
最新標準規格 (2024)•RFC 9562 セクション 5.7
UUID バージョン7 技術仕様 (RFC 9562)
UUIDv7は、48ビットのミリ秒単位UNIXタイムスタンプと74ビットの暗号論的ランダムエントロピーを統合した仕様です。従来のUUIDv4によるデータベースインデックス断片化とページ分割の課題を根本から解消するためにRFC 9562(2024年公開)で標準化されました。
ビットフィールド構成とバイナリ構造
RFC規格に準拠した詳細な128ビットバイト構成。
| フィールド名 | ビット範囲 | 用途と詳細説明 |
|---|---|---|
| unix_ts_ms | 48ビット (0-47) | ミリ秒精度のビッグエンディアン符号なしUNIXエポックタイムスタンプ。 |
| ver | 4ビット (48-51) | 固定バイナリ値 0111(バージョン7を識別)。 |
| rand_a | 12ビット (52-63) | ランダムエントロピーまたはミリ秒未満のシーケンスカウンタ。 |
| var | 2ビット (64-65) | 固定バイナリ値 10(RFC 4122/9562標準バリアント)。 |
| rand_b | 62ビット (66-127) | 暗号論的に安全な疑似乱数エントロピービット。 |
✓
メリットと利点
- •作成日時による自然な時系列ソートが可能(PostgreSQL、MySQL、SQLiteなどのB-Treeインデックスに最適)。
- •大量データ挿入時のランダムディスクI/O、キャッシュミス、ページ分割を劇的に削減。
- •ミリ秒あたり74ビットのエントロピーにより、分散環境でも衝突リスクを完全に排除。
- •追加のデータベース参照なしでUUIDから直接タイムスタンプを抽出可能。
!
注意点とトレードオフ
- •公開URLで使用した場合、生成されたおおよその時刻(ミリ秒精度)が露出します。
- •同一ミリ秒内に複数IDを生成する際は単調増加カウンタの管理が推奨されます。
最適なユースケース
- →RDBMSやドキュメントDB(PostgreSQL、MySQL、CockroachDB、MongoDB)の主キー。
- →イベントストリーミング、監査ログ、メッセージキュー(Kafka、RabbitMQ、SQS)。
- →時系列データおよび時系列台帳の記録。
非推奨のユースケース
- ✕生成日時を完全に隠蔽する必要があるセキュリティトークンや秘密セッション。
コード実装サンプル
Native Node.js / BrowserTypeScript / Node.js
// Browser / Node 22+ with Web Crypto
function generateUUIDv7(): string {
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
const now = Date.now();
bytes[0] = (now / 0x10000000000) & 0xff;
bytes[1] = (now / 0x100000000) & 0xff;
bytes[2] = (now / 0x1000000) & 0xff;
bytes[3] = (now / 0x10000) & 0xff;
bytes[4] = (now / 0x100) & 0xff;
bytes[5] = now & 0xff;
bytes[6] = (bytes[6] & 0x0f) | 0x70; // version 7
bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant
return [...bytes].map((b, i) =>
(i === 4 || i === 6 || i === 8 || i === 10 ? '-' : '') + b.toString(16).padStart(2, '0')
).join('');
}Python (uuid6 / 3.14+)Python
import uuid6
new_id = uuid6.uuid7()
print(new_id) # e.g. 018e6a12-8921-71e4-8a4e-128a9b345678PostgreSQL FunctionPostgreSQL
-- PostgreSQL 13+ native UUIDv7 generator
CREATE OR REPLACE FUNCTION uuid_generate_v7()
RETURNS uuid AS $$
DECLARE
v_time numeric = extract(epoch FROM clock_timestamp()) * 1000;
v_bytes bytea = gen_random_bytes(16);
BEGIN
v_bytes = set_byte(v_bytes, 0, (v_time::bigint >> 40)::int);
v_bytes = set_byte(v_bytes, 1, (v_time::bigint >> 32)::int);
v_bytes = set_byte(v_bytes, 2, (v_time::bigint >> 24)::int);
v_bytes = set_byte(v_bytes, 3, (v_time::bigint >> 16)::int);
v_bytes = set_byte(v_bytes, 4, (v_time::bigint >> 8)::int);
v_bytes = set_byte(v_bytes, 5, (v_time::bigint)::int);
v_bytes = set_byte(v_bytes, 6, (get_byte(v_bytes, 6) & 15) | 112);
v_bytes = set_byte(v_bytes, 8, (get_byte(v_bytes, 8) & 63) | 128);
RETURN encode(v_bytes, 'hex')::uuid;
END;
$$ LANGUAGE plpgsql VOLATILE;よくある質問
なぜUUIDv4からUUIDv7へ移行すべきなのですか?▼
UUIDv4はB-Treeインデックス全体にランダムに挿入されるため、深刻な断片化が発生します。UUIDv7は時系列順に追加されるため、最大4倍のインデックス書き込み性能を発揮します。
既存のUUIDv4カラムと互換性はありますか?▼
はい、完全な互換性があります。同じ128ビット形式(ハイフン付き32桁16進数)であるため、既存のスキーマを変更せず格納できます。