UUIDをブラウザ内で生成・検証する
UUIDv4・v7の生成、形式・Version・Variant・重複・v7 Timestampの確認を、入力値を外部送信せず実行できます。
UUIDv4を生成する結論:CSPRNGで122bitのRandom部分を作り、Version・Variant bitを固定する
UUIDv4は128bitのうちVersionとVariantを除く122bitをRandomまたはPseudorandom Dataで構成します。Browserではcrypto.randomUUID()が36文字のv4 UUIDを返します。
高い確率で一意になりますが、中央Registryで予約された値でも数学的に衝突不可能な値でもありません。利用先にはUnique制約を用意します。
DevelopToolsはrandomUUID()を優先し、非対応時もgetRandomValues()へFallbackします。
生成結果のVersionとVariantを確認する
標準表記xxxxxxxx-xxxx-4xxx-[89ab]xxx-xxxxxxxxxxxxでは、3番目Group先頭が4、4番目Group先頭が8・9・a・bです。
大文字・小文字はbit値を変えません。受け渡し先のStyleへ合わせても同じUUID値です。
| 確認項目 | 確認方法 | 判断 |
|---|---|---|
| 乱数源 | Web Crypto API | CSPRNG |
| Version | 3番目Group先頭 | 4 |
| Variant | 4番目Group先頭 | 8/9/a/b |
| 重複 | 生成後と保存先 | Unique制約 |
UUID生成・検証ツールで確認する手順
- Versionでv4を選びます。
- 必要件数と表示形式を選びます。
- 生成してVersion・Variantを確認します。
- 利用先へCopyまたはFile保存します。
生成件数を増やしてもUUID本体をlocalStorageへ保存しません。
Browser標準APIとFallbackの境界
const id = crypto.randomUUID();
console.log(id); // Version 4 UUID
FallbackではgetRandomValues()で16byteを作り、byte 6の上位4bitを0100、byte 8の上位2bitを10へ設定します。Math.random()だけを乱数源にしません。
形式・Version・Variantを分けて確認する
| 確認対象 | 位置・条件 | 分かること |
|---|---|---|
| 文字列表記 | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | 32桁のHexと4個のHyphenからなる36文字 |
| Version | 3番目Groupの先頭Nibble(bit 48~51) | v1~v8などのLayout識別 |
| Variant | 4番目Groupの先頭Nibble上位bit | 残りのFieldをどの規則で解釈するか |
| 値の意味 | Version固有Field、生成方式、利用側制約 | 時刻・名前空間・乱数などの妥当性 |
RFC 9562の標準テキスト表記は128bitを8-4-4-4-12のHex Groupへ分けます。英字Hexは大文字・小文字・混在を許容します。36文字の形式が正しくても、期待したVersionや用途に合う値であるとは限らないため、段階を分けて確認します。
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
^ ^
| +-- Variantを含むNibble
+------- Version Nibble
DevelopToolsのUUID生成・検証ツールでできること
| 項目 | 現行ツールの仕様 |
|---|---|
| 生成 | UUIDv4・UUIDv7を1~10,000件生成 |
| 入力 | 8-4-4-4-12形式、32桁Hex、波括弧付き、urn:uuid:形式を受け付ける |
| 検証 | 形式、Version、Variant、重複、Nil UUID、Max UUIDを確認 |
| UUIDv7 | RFC Variantのv7から先頭48bitのUnix時刻(ミリ秒)を表示 |
| 出力 | 改行、カンマ、JSON、CSV、JavaScript配列、SQL IN句へ変換 |
| 保存 | TXT・CSV・JSONをUTF-8 BOM付きでローカル保存 |
| 未対応 | UUIDv1・v3・v5・v6・v8の生成、ULID・NanoIDの生成 |
| データ保持 | Version・件数・表示形式などの設定だけをlocalStorageへ保存し、UUID本体は保存しない |
検証時は前後の空白を除き、URNや波括弧を外し、32桁Hexを標準形式へ正規化します。形式が正しくても、Version固有のすべてのFieldが用途どおりか、発行元が信頼できるかまでは保証しません。
UUIDv4はcrypto.randomUUID()を優先し、利用できない場合もcrypto.getRandomValues()で16byteを作ってVersion・Variant bitを設定します。UUIDv7は先頭48bitへDate.now()のUnixミリ秒を格納し、同一ミリ秒内では乱数部を加算して画面内の生成順を維持します。
一意性・秘密情報・プライバシーを混同しない
| 用途 | UUIDで扱う範囲 | 別に必要な対策 |
|---|---|---|
| Record ID・Request ID | 分散環境で調整なしに識別子を生成 | Unique制約と衝突時の再試行 |
| API Token・Session Secret | 識別子として参照に使う場合がある | 十分なEntropy、認可、失効、漏洩対策 |
| 改ざん検知 | UUID単体では変更を検出しない | 署名、MAC、認証済みMessage |
| 時刻の秘匿 | v7は先頭48bitからミリ秒時刻を読める | 時刻を露出しない設計やv4の検討 |
UUIDは数学的に絶対衝突しない値ではなく、方式ごとの乱数・時刻・Counter・Namespace設計で衝突確率を小さくする識別子です。DBではUUID列へUnique制約を付け、入力競合や再試行を扱える設計にします。
RFC 9562はUUIDを「所持しているだけでアクセスを許可するSecurity Capability」として扱わないよう求めています。UUIDv4がRandomでもPassword、API Key、Reset Token、Session認証の設計を置き換えません。
ブラウザ内で扱う場合のプライバシー確認
- 本番Record IDやUser IDを貼り付ける前に、その値自体が機密情報でないか確認する
- 現行ツールは生成・検証したUUIDを外部APIへ送信しない
- コピー後はOSやBrowserのClipboard履歴へ残る可能性がある
- 画面設定はlocalStorageへ残るが、生成値・検証値・v7 Timestampは保存しない
- 共有用の記事やIssueには本番UUIDではなくDummy UUIDを使う
ブラウザ内処理はUploadを避けますが、端末のMalware、悪意あるExtension、画面共有、Clipboard監視まで防ぐ保証ではありません。機密性の高い識別子は信頼できる端末で扱います。
一次資料と実行環境を確認する
現行仕様は2024年5月公開のRFC 9562を基準にします。RFC 9562はRFC 4122を置き換えています。LibraryにRFC_4122等の名称が残る場合は互換性のための公式API名として区別し、利用中のRuntime Versionも確認します。
具体例:API Test用UUIDを100件作る
v4、100件、JSON形式を選んで生成し、Version 4とRFC Variantを確認します。
JSON配列として保存し、Test Dataへ割り当てます。投入先DBにはUnique制約を残します。
- v4選択
- 100件指定
- JSON生成
- Version確認
- 生成結果をJSON形式で保存する
本番Secretの代わりではなく、識別子のTest Dataとして使用します。
よくある質問
- UUIDは世界で絶対に重複しませんか?
- いいえ。適切な生成方式により衝突確率を非常に小さくする識別子です。利用側でもUnique制約と衝突時の処理を用意します。
- UUIDをPasswordやAPI Tokenとして使えますか?
- 識別子とSecretは役割が異なります。UUIDの所持だけでAccessを許可せず、用途に合う認証・認可・失効設計を使用してください。
- 入力したUUIDはServerへ送信されますか?
- 現行のUUID生成・検証ツールは処理をBrowser内で行い、UUID本体をServerや外部APIへ送信しません。