UUID(Universally Unique Identifier)は、分散システム・データベース・APIで一意なIDを生成するための標準的な手段です。中央集権的な調整なしに、グローバルな一意性が設計によって保証されています。
UUIDとは
UUIDは128ビットの数値で、通常はハイフンで区切られた5グループの16進数として表現されます:
550e8400-e29b-41d4-a716-446655440000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
M— バージョン番号(1、3、4、または5)N— バリアントビット(8、9、a、またはb)
標準フォーマットは8-4-4-4-12:ハイフンを含む36文字、16進数32文字。
UUIDのバージョン
| バージョン | 生成方法 | 用途 |
|---|---|---|
| v1 | タイムスタンプ + MACアドレス | 時刻順ソート可能だがMACアドレスが漏洩する可能性 |
| v3 | 名前空間 + 名前(MD5) | 決定論的 — 同じ入力は常に同じUUIDを生成 |
| v4 | ランダム | 最も一般的 — 純粋にランダムで情報漏洩なし |
| v5 | 名前空間 + 名前(SHA-1) | v3より安全な決定論的ID |
圧倒的多数のユースケースではv4が正しい選択です。
UUID v4の衝突確率
毎秒10億個のUUIDを生成し続けた場合、1つの衝突が50%の確率で発生するまでに約85年かかります。実用上、UUIDは無限に一意と言えます。
オンラインでUUIDを生成
- 単発または一括生成
- ワンクリックコピー
- ブラウザ上で完全動作 — サーバーには何も送信されない
コードでUUIDを生成する
JavaScript(Node.js 18+)
import { randomUUID } from 'crypto';
const id = randomUUID();
// 'f47ac10b-58cc-4372-a567-0e02b2c3d479'
Node.js 14.17+ではcrypto.randomUUID()としても利用可能です。
JavaScript(ブラウザ)
const id = crypto.randomUUID();
// すべてのモダンブラウザで対応(Chrome 92+、Firefox 95+、Safari 15.4+)
uuidライブラリを使う(レガシーサポート)
npm install uuid
import { v4 as uuidv4 } from 'uuid';
const id = uuidv4();
Python
import uuid
# v4(ランダム)
id = uuid.uuid4()
print(str(id)) # 'f47ac10b-58cc-4372-a567-0e02b2c3d479'
# v5(名前空間ベース、決定論的)
id = uuid.uuid5(uuid.NAMESPACE_URL, 'https://zerotool.dev')
Go
import "github.com/google/uuid"
id := uuid.New()
fmt.Println(id.String())
SQL(PostgreSQL)
-- UUIDを生成
SELECT gen_random_uuid();
-- UUIDを主キーとして使用
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL
);
UUIDをデータベースの主キーとして使う
メリット
- グローバルな一意性 — 複数のサービスやデータベースをまたいで衝突しない
- 中央シーケンス不要 — データベースに書き込む前にクライアント側でIDを生成できる
- 情報漏洩なし — 自動インクリメントIDと違い、行数を推測されない
デメリット
- インデックスの断片化 — ランダムなUUIDはB木の断片化を引き起こし、連番整数より挿入が遅くなる
- ストレージサイズ — 整数の4〜8バイトに対して16バイト
- 自然な順序なし — v4 UUIDには時刻ベースのソート順がない
解決策:UUID v7(ドラフト)
UUID v7は上位ビットにタイムスタンプを配置し、一意性と単調増加の順序を兼ね備えます。データベースの主キーに最適で、すでに対応しているライブラリもあります:
// Node.js
import { v7 as uuidv7 } from 'uuid';
const id = uuidv7();
// '017f22e2-79b0-7cc3-98c4-dc0c0c07398f'
// 先頭セグメントはミリ秒精度のタイムスタンプ — 自然にソート可能
フォーマットの変種
標準: 550e8400-e29b-41d4-a716-446655440000
ハイフンなし: 550e8400e29b41d4a716446655440000
大文字: 550E8400-E29B-41D4-A716-446655440000
URN: urn:uuid:550e8400-e29b-41d4-a716-446655440000
データベースに保存する場合、VARCHARよりもネイティブのUUID型(PostgreSQL、MySQL 8.0+)を推奨します。ストレージを節約し、比較が高速になります。
UUIDの検証
// JavaScript
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
UUID_REGEX.test('550e8400-e29b-41d4-a716-446655440000'); // true
# Python
import uuid
def is_valid_uuid(val):
try:
uuid.UUID(str(val))
return True
except ValueError:
return False
まとめ
| 目的 | 推奨アプローチ |
|---|---|
| 素早く生成 | ZeroTool UUID ジェネレーター |
| ブラウザ / Node.js | crypto.randomUUID() |
| Python | uuid.uuid4() |
| DB主キー(順序付き) | UUID v7 または ULID |
| 決定論的ID | UUID v5 |
UUID v4は圧倒的多数のユースケースで機能します。データベースフレンドリーな順序付きIDが必要な場合は、UUID v7またはULIDを検討してください。