UUIDジェネレーター:v1〜v7対応、無料でユニークIDを生成
UUIDとは?
UUID(Universally Unique Identifier:ユニバーサル一意識別子)は、コンピューターシステムで情報を一意に識別するために使用される128ビットの識別子です。UUIDはRFC 4122で標準化されており、その膨大なエントロピーにより、衝突の可能性は実質的にゼロであることが保証されます。つまり、独立して生成された2つのUUIDは、ほぼ確実に一意になります。
UUIDの標準形式はxxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxxです。ここで、各xは16進数(0-9、a-f)を示し、MはUUIDのバージョンを、Nはバリアントを示します。
UUIDのバージョン
UUID v1 (タイムスタンプ + MACアドレス)
UUID v1は、現在のタイムスタンプとランダムな値(ブラウザではMACアドレスの代わりに)に基づいています。1582年10月15日(グレゴリオ暦)からの100ナノ秒間隔を使用します。
使用例:
- UUIDを時系列で並べる必要がある状況
- デバッグとログ記録(UUIDには作成時刻の情報が含まれる)
- 時間同期を伴う分散システム
例: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
利点:
- UUIDを作成時刻で時系列にソートできる
- 監査やデバッグに役立つ
- タイムスタンプ情報を含む
欠点:
- タイムスタンプを含むため、潜在的なセキュリティリスクがある
- ブラウザでは実際のMACアドレスを含まない(ランダムな値に置き換えられる)
- データベースの局所性が低い(タイムスタンプが下位ビットにあるため)
UUID v3 (MD5ハッシュ)
UUID v3は、ネームスペースUUIDと名前のMD5ハッシュを使用して生成されます。決定論的であり、同じネームスペースと名前からは常に同じUUIDが生成されます。
使用例:
- URL、DNS名、またはその他の識別子をUUIDに変換する
- 再現可能なUUIDが必要な状況
- 異なる識別システム間のマッピング
例: a3bb189e-8bf9-3888-9912-ace4e6543002
利点:
- 決定論的(同じ入力からは常に同じ出力)
- 既知の識別子の変換に最適
- 異なる入力に対して衝突がない
欠点:
- MD5は古いアルゴリズムである(v5を推奨)
- ネームスペースと名前が必要
- 元の入力を復元できない
UUID v4 (ランダム) - 推奨
最も広く使用されているUUIDのバージョンです。UUID v4は、暗号学的に安全な乱数ジェネレーター(crypto.getRandomValues())を使用して完全にランダムに生成されます。
使用例:
- データベースの主キー
- セッションID
- 一意のファイル名
- APIトークン
- 確実に一意のIDが必要な一般的な目的
例: f47ac10b-58cc-4372-a567-0e02b2c3d479
利点:
- 最大限のエントロピーとセキュリティ
- 時間やシステムパラメータに依存しない
- 最もシンプルな実装
衝突の確率: 1秒間に10億個のUUIDを100年間生成し続けても、衝突の確率は約0.00000006%です。
UUID v5 (SHA-1ハッシュ)
UUID v5はv3と同じですが、MD5の代わりにSHA-1を使用します。v3よりも近代的で安全な代替手段です。
使用例:
- v3と同じですが、セキュリティが向上
- 新しいプロジェクトではv3よりも推奨される
- URL、DNS名、OID、X.500 DNからUUIDを生成する
例: 886313e1-3b8a-5372-9b90-0c9aee199e5d
利点:
- 決定論的
- SHA-1はMD5よりも堅牢
- システム間のマッピングに適している
欠点:
- SHA-1も古いと見なされている(ただしMD5よりは安全)
- ネームスペースと名前が必要
UUID v6 (ソート可能なタイムスタンプ)
UUID v6は、データベースのインデックス作成を改善するために時間ビットが再配置されたv1の改良版です。データベースの局所性に関する問題を解決するために設計されました。
使用例:
- タイムスタンプ順のデータベース主キー
- 時系列順とデータベースパフォーマンスの両方が必要なシステム
- v1のより現代的な代替手段
例: 1ec9414c-232a-6b00-b3c8-9e6bdeced846
利点:
- v1よりもデータベースの局所性が向上(タイムスタンプが上位ビットにある)
- 時系列順にソート可能
- UUID標準と互換性がある
欠点:
- v1/v4ほど広く使用されていない
- 依然として時間情報を含む(セキュリティリスク)
UUID v7 (Unixタイムスタンプ)
UUID v7は、Unixタイムスタンプ(1970年からのミリ秒)とランダムビットを使用します。データベースの局所性が最も優れた最新のUUIDバージョンです。
使用例:
- 現代的なデータベース主キー
- パフォーマンスと時系列順の両方が必要なシステム
- 新しいプロジェクトにおけるv1/v6の代替
例: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f
利点:
- 全バージョンの中で最高のデータベース局所性
- Unixタイムスタンプは標準的
- ランダム性と時系列順の利点を組み合わせる
欠点:
- 比較的新しい仕様(RFC 4122bis)
- レガシーシステムでのサポートが少ない
どのUUIDバージョンを使用すべきか?
決定ガイド
最大限のセキュリティとランダム性が必要ですか? → UUID v4 を使用してください(最も一般的な選択肢)
時系列順とデータベースパフォーマンスが必要ですか? → UUID v7 (現代的) または UUID v6 (標準) を使用してください
既存の識別子から再現可能なUUIDが必要ですか? → UUID v5 (SHA-1) または UUID v3 (MD5, レガシー) を使用してください
タイムスタンプと監査証跡が必要ですか? → UUID v1 (レガシー、DBパフォーマンスが低い) を使用してください
データベース
新しいプロジェクトの場合: UUID v7またはv4
- v7 は時系列順とパフォーマンスに最適
- v4 は時間情報を含まない最大限のランダム性を提供
レガシーシステムの場合: UUID v1またはv6
- v6 はv1よりもデータベースの局所性が向上
- v1 は広くサポートされている
UUIDを主キーとして使用する利点:
- グローバルな一意性 – 異なるデータベースからデータを衝突なく結合できる
- セキュリティ – シーケンシャルID(1, 2, 3…)とは異なり、次の値を推測できない
- 分散システム – 複数のサーバーで調整なしに独立してUUIDを生成できる
- データベースのマージ – 2つのデータベースをマージする際に衝突が発生しない
欠点:
- サイズが大きい(整数型が4-8バイトなのに対し16バイト)
- 一部のデータベースではインデックス作成が遅い(パフォーマンス向上のためにv6/v7を使用)
- 人間にとっては読みにくい
APIとWebサービス
- REST API – リソースの一意の識別子
- GraphQL – ノードのグローバルな識別子
- Webhook – リクエストと応答の追跡
- トークン – セッションID、リフレッシュトークン
ファイルとストレージ
- ファイル名 – アップロード時の衝突防止
- S3/クラウドストレージ – オブジェクトの一意のパス
- キャッシュキー – キャッシュシステム内の識別子
フロントエンドアプリケーション
- React/Vueコンポーネント – リストの一意のキー
- 一時ID – データベースに保存する前のID
- ローカルストレージ – 保存されたデータのキー
- オフラインファーストアプリケーション – サーバーへの接続なしでのID生成
高度なジェネレーター機能
カスタム時間でのUUID生成
時間ベースのバージョン(v1、v6、v7)では、日付/時刻ピッカーを使用して任意のタイムスタンプを選択できます。これは以下の目的で役立ちます。
テスト:
- 過去に作成されたUUIDのシミュレーション
- データベースにおける時系列順のテスト
- デバッグのためのUUIDの再現
データ移行:
- 過去のタイムスタンプを持つUUIDの生成
- 正しいタイムスタンプ値を持つデータのバックフィル
- 異なる期間からのデータのインポート
監査とコンプライアンス:
- 記録作成時刻に基づくUUIDの再構築
- 遡及的な識別子の生成
使用例:
- v1、v6、またはv7のバージョンを選択します
- 日付/時刻ピッカーを使用して日付と時刻を設定します
- 独自のタイムスタンプでUUIDを生成します
ハッシュベースUUID (v3, v5)
決定論的なUUIDには、v3(MD5)またはv5(SHA-1)のバージョンを使用できます。
使用方法:
- 識別子のタイプに基づいてネームスペースを選択します
- 名前/値を入力します
- UUIDを生成します
例:
| ネームスペース | 名前 (入力) | 用途 |
|---|---|---|
| DNS | example.com | ドメイン名をUUIDに変換 |
| DNS | google.com | 各Webサイトには一意のUUIDがある |
| URL | https://example.com/page | URLをUUIDに変換 |
| URL | https://api.example.com/users/123 | APIエンドポイントをUUIDとして使用 |
| OID | 1.3.6.1.4.1.343 | オブジェクト識別子をUUIDに変換 |
| X.500 | CN=John Doe,O=Company | 識別名をUUIDに変換 |
重要な特性:
- ✅ 決定論的: 同じ入力からは常に同じUUIDが生成される
- ✅ 再現可能: いつでもUUIDを再作成できる
- ✅ 一貫性: 異なるシステム間で同じUUIDを生成できる
- ❌ デコード不可: UUIDから元の名前を復元することはできない
- ℹ️ 単一UUID: v3/v5では、常に1つのUUIDのみが生成される(同じ入力からは同じ出力)
実用的な使用例:
// 例: URLをUUID v5に変換
Namespace: URL
Name: https://example.com/api/users/123
Result: 886313e1-3b8a-5372-9b90-0c9aee199e5d
// 同じ入力からは常に同じUUID
Namespace: DNS
Name: google.com
Result: google.comに対しては常に同じUUIDが生成される
UUIDを安全に使用する方法
暗号学的セキュリティ
当社のジェネレーターは、暗号学的に安全な乱数ジェネレーターであるcrypto.getRandomValues()を使用しています。予測可能でありセキュリティ目的に適さないMath.random()とは異なり、crypto.getRandomValues()は以下に適した真のエントロピーを提供します。
- セキュリティトークンの生成
- セッションID
- APIキー
- 暗号化アプリケーション
UUIDバージョンの比較
| バージョン | 根拠 | 衝突 | 時系列順 | DBパフォーマンス | 用途 |
|---|---|---|---|---|---|
| v1 | タイムスタンプ + MAC | 低 | ✅ はい | ❌ 低下 | レガシー、監査 |
| v3 | MD5ハッシュ | なし (決定論的) | ❌ いいえ | ⚠️ 中 | 変換 (レガシー) |
| v4 | ランダム | 極めて低い | ❌ いいえ | ⚠️ 中 | 一般的な用途 |
| v5 | SHA-1ハッシュ | なし (決定論的) | ❌ いいえ | ⚠️ 中 | 変換 (推奨) |
| v6 | ソートされたタイムスタンプ | 低 | ✅ はい | ✅ 向上 | 時刻付き現代DB |
| v7 | Unixタイムスタンプ | 低 | ✅ はい | ✅ 最高 | 新規プロジェクト |
UUIDと他の識別子の比較
| タイプ | サイズ | 衝突 | 時系列順 | 用途 |
|---|---|---|---|---|
| 自動インクリメントID | 4-8バイト | テーブル内で一意性が保証される | ❌ | シンプルなアプリケーション、ローカルDB |
| UUID v4 | 16バイト | 実質的に不可能 | ❌ | 分散システム、API |
| UUID v7 | 16バイト | 実質的に不可能 | ✅ | パフォーマンスの高い現代DB |
| ULID | 16バイト | 実質的に不可能 | ✅ | UUID + 辞書順ソート |
| Snowflake ID | 8バイト | 正しい設定で一意性が保証される | ✅ | Twitter、分散システム |
| NanoID | 設定可能 | 長さに依存 | ❌ | URLフレンドリーなID |
各種言語での実装
JavaScript/TypeScript
// UUID v4 - 最も簡単な方法 (モダンブラウザ)
const uuid = crypto.randomUUID();
// UUID v4 - 手動実装
function generateUUIDv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
const r = (crypto.getRandomValues(new Uint8Array(1))[0] & 0x0f) >> (c === 'x' ? 0 : 2);
const v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
// UUID v7 - データベース向け推奨
function generateUUIDv7() {
const timestamp = Date.now();
const timeHi = (timestamp >> 16).toString(16).padStart(8, '0');
const timeLow = (timestamp & 0xFFFF).toString(16).padStart(4, '0');
const randomBytes = crypto.getRandomValues(new Uint8Array(10));
const randomHex = Array.from(randomBytes)
.map(b => b.toString(16).padStart(2, '0'))
.join('');
return `${timeHi}-${timeLow}-7${randomHex.substr(0, 3)}-${randomHex.substr(3, 4)}-${randomHex.substr(7)}`;
}
Python
import uuid
# UUID v4
uuid_v4 = str(uuid.uuid4())
# Output: '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
# UUID v1
uuid_v1 = str(uuid.uuid1())
Java
import java.util.UUID;
// UUID v4
String uuidV4 = UUID.randomUUID().toString();
PHP
// UUID v4 (PHP 7+)
function generateUUID() {
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff), mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
}
C#
using System;
// UUID v4
Guid uuid = Guid.NewGuid();
string uuidString = uuid.ToString();
ベストプラクティス
データベースへのUUIDの保存
PostgreSQL:
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
MySQL 8.0+:
CREATE TABLE users (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
ヒント: MySQLでは、スペースを節約し、より高速なインデックス作成のために、UUIDをCHAR(36)ではなくBINARY(16)として保存してください。
UUIDの検証
function isValidUUID(uuid) {
const 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;
return regex.test(uuid);
}
UUIDの変換
// ハイフンの削除
const compact = uuid.replace(/-/g, '');
// ハイフンを再度追加
function formatUUID(compactUuid) {
return [
compactUuid.substring(0, 8),
compactUuid.substring(8, 12),
compactUuid.substring(12, 16),
compactUuid.substring(16, 20),
compactUuid.substring(20, 32)
].join('-');
}
トラブルシューティング
UUID v3/v5が動作しない場合
問題: v3またはv5を選択しても何も生成されない
解決策:
- ✅ 「名前」フィールドが入力されていることを確認してください - 必須です!
- ✅ 入力のタイプに応じて正しいネームスペースを選択してください
- ✅ 有効な入力の例:
- DNS:
example.com,google.com - URL:
https://example.com/page - 任意のテキスト:
my-application-v1
- DNS:
ヒント: まずはtestのような単純な値とDNSネームスペースを試してみてください。
時間ベースのUUID (v1, v6, v7) の時刻がおかしい場合
問題: 生成されたUUIDが予期しないタイムスタンプを持っている
解決策:
- ✅ 日付/時刻ピッカーを確認してください - 正しい時刻が設定されていますか?
- ✅ 日付/時刻ピッカーはあなたのローカルタイムゾーンを使用します
- ✅ 現在の時刻を使用するには、日付/時刻ピッカーを空のままにしてください
UUIDがコピーできない場合
問題: 「すべてコピー」ボタンが機能しない
解決策:
- ✅ UUIDが生成されていることを確認してください(空ではないことを確認)
- ✅ 一部のブラウザでは、Clipboard APIにHTTPSが必要です
- ✅ または、テキストエリア内のテキストを選択して手動でコピーしてください (Ctrl+C)
よくある質問 (FAQ)
UUIDの衝突は発生しますか?
理論的には発生しますが、その確率は天文学的に小さいです。1秒あたり10億個のUUID v4を100年間生成し続けても、衝突の可能性は約0.00000006%です。実際には、衝突が発生することはありません。UUIDはデータベースの主キーとして適していますか?
ユースケースによります。UUIDは分散システムやグローバルな一意性が必要な状況に最適です。単一データベースのシンプルなアプリケーションでは、自動インクリメントの方が効率的である場合があります。このツールで生成されたUUIDは安全ですか?
はい、暗号学的に安全な乱数を提供するWeb Crypto API (`crypto.getRandomValues()`) を使用しています。すべての処理はブラウザ内でローカルに行われます。UUIDのバージョン間の違いは何ですか?
- **v1**: タイムスタンプ + MAC/ランダム - 時系列順にソート可能、DBパフォーマンスが低い - **v3/v5**: ハッシュベース - 決定論的、既知の識別子の変換用 - **v4**: ランダム - 最も安全で、最も広く使用されている - **v6**: 再配置されたタイムスタンプ - v1よりもDBパフォーマンスが向上 - **v7**: Unixタイムスタンプ - 最高のDBパフォーマンス + 時系列順にソート可能どのUUIDバージョンを使用すべきですか?
ほとんどの場合、**v4** (ランダム) を使用してください。時系列順のデータベースには**v7** (現代的) または **v6** (標準) を使用してください。既知の識別子(URL、DNS)の変換には**v5** (SHA-1) を使用してください。UUIDをトークンやAPIキーに使用できますか?
UUID v4はセッションIDや同様のトークンに適しています。APIキーには、より長いランダムな文字列(例:256ビット値)や専門のライブラリの使用を検討してください。UUIDのサイズはどれくらいですか?
UUIDは128ビット(16バイト)です。ハイフンを含む文字列形式では36文字、ハイフンなしでは32の16進文字を占めます。UUIDの代替案
ULID (Universally Unique Lexicographically Sortable Identifier)
- 128ビットID(UUIDと同様)
- 作成時刻に基づいて辞書順にソート可能
- よりコンパクトな表現(36文字の代わりに26文字)
- 大文字と小文字を区別しないBase32エンコーディング
例: 01ARZ3NDEKTSV4RRFFQ69G5FAV
NanoID
- UUIDよりも小さいサイズ(標準で21文字)
- URLフレンドリー(特殊文字なし)
- より高速な生成
- 長さとアルファベットを設定可能
例: V1StGXR8_Z5jdHi6B-myT
Snowflake ID (Twitter)
- 64ビットID(UUIDよりも小さい)
- 時系列順にソート可能
- ワーカーIDとシーケンス番号を含む
- 一元化された構成が必要
例: 1234567890123456789
パフォーマンスと最適化
生成速度
当社のジェネレーターは以下を生成できます。
- 1 UUID: < 1 ms
- 100 UUID: 約10-20 ms
- 1000 UUID: 約100-200 ms
パフォーマンス向上のヒント
- バッチ生成 – 多数のUUIDが必要な場合は、1つずつではなく一度に生成してください
- DBへの保存 – 高速検索のためにUUID列にインデックスを作成してください
- 圧縮 – UUIDを文字列(36バイト)ではなくバイナリ形式(16バイト)で保存してください
- キャッシュ – 場合によっては、UUIDを事前に生成してキャッシュすることができます
開発者向け
UUID v4の構造
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
| | | | |
| | | | └─ 48ビットのランダムデータ (node)
| | | └────── 16ビットのランダムデータとバリアント (clock_seq)からの4ビット
| | └─────────── 12ビットのランダムデータ + 4ビットのバージョン (time_hi_and_version)からの4ビット
| └──────────────── 16ビットのランダムデータ (time_mid)
└───────────────────────── 32ビットのランダムデータ (time_low)
- バージョン (4ビット): 常に
0100(バイナリ) =4(16進数) - バリアント (2-3ビット): RFC 4122では常に
10(バイナリ)
UUIDのテスト
// Jestテスト
describe('UUID Generator', () => {
test('valid UUID v4を生成する', () => {
const uuid = generateUUIDv4();
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
expect(regex.test(uuid)).toBe(true);
});
test('一意のUUIDを生成する', () => {
const uuid1 = generateUUIDv4();
const uuid2 = generateUUIDv4();
expect(uuid1).not.toBe(uuid2);
});
});
セキュリティの側面
UUIDでしてはいけないこと
❌ 機密性の高いアプリケーションにUUID v1を使用しないでください – タイムスタンプが含まれており、セキュリティリスクとなる可能性があります
❌ UUIDの生成にMath.random()を使用しないでください – 暗号学的に安全ではありません
❌ 承認のためにUUIDに依存しないでください – UUIDは推測される可能性があります(極めて低い確率ですが)
❌ UUIDを暗号化せずにCookieに保存しないでください – 署名付きCookieまたはJWTを使用してください
するべきこと
✅ ほとんどの場合、UUID v4を使用してください – 最高の乱数性とセキュリティ
✅ UUIDを他のセキュリティ対策と組み合わせてください – セッション管理にはHTTPS、HttpOnly Cookie、短い有効期限を使用してください
✅ サーバー側でUUIDを検証してください – 常にUUIDの形式とバージョンを確認してください
✅ 暗号学的に安全な乱数源を使用してください – ブラウザではcrypto.getRandomValues()、Linuxでは/dev/urandom
豆知識
- 可能なUUID v4の数: 2^122 ≈ 5.3 × 10^36 (340ウンデシリアン)
- 衝突に必要な数: 衝突の確率が50%になるには、2.71 × 10^18個のUUID(2.71クインティリオン)を生成する必要があります
- 可能なすべてのUUIDのサイズ: 各UUIDを16バイトとして保存した場合、全空間は85ゼタバイト(850億テラバイト)を占めます
- 起源: UUIDは1990年にDCE(Distributed Computing Environment)の一部として標準化されました