メインコンテンツへ移動

UUID バージョン7 ジェネレーター

UUIDv7 • 時系列ソート対応 (RFC 9562)
00000000-0000-0000-0000-000000000000
囲み文字:

UUID一括バッチ生成

最大 5,000件
フォーマットと構造設定

準備完了

No batch active
最新標準規格 (2024)RFC 9562 セクション 5.7

UUID バージョン7 技術仕様 (RFC 9562)

UUIDv7は、48ビットのミリ秒単位UNIXタイムスタンプと74ビットの暗号論的ランダムエントロピーを統合した仕様です。従来のUUIDv4によるデータベースインデックス断片化とページ分割の課題を根本から解消するためにRFC 9562(2024年公開)で標準化されました。

ビットフィールド構成とバイナリ構造

RFC規格に準拠した詳細な128ビットバイト構成。

フィールド名ビット範囲用途と詳細説明
unix_ts_ms48ビット (0-47)ミリ秒精度のビッグエンディアン符号なしUNIXエポックタイムスタンプ。
ver4ビット (48-51)固定バイナリ値 0111(バージョン7を識別)。
rand_a12ビット (52-63)ランダムエントロピーまたはミリ秒未満のシーケンスカウンタ。
var2ビット (64-65)固定バイナリ値 10(RFC 4122/9562標準バリアント)。
rand_b62ビット (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-128a9b345678
PostgreSQL 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進数)であるため、既存のスキーマを変更せず格納できます。