Yueseryueser.com

← ガイド一覧

UUID 生成ガイド:v4 の一括生成と正しい使い方

重複しないランダムな ID がまとめて必要なだけなら、生成してコピーすれば終わりです。この記事が必要になるのは、どの方式の ID を使うか、どう保存するか、外部に見せてよいかを決めるときです。

ツールを開く:UUID Generator

UUID が本当に必要な場面

複数の場所が、中央に問い合わせずに ID を発行したいときに UUID は効きます。オフラインで下書きを作るブラウザ、電波の悪い場所で記録を溜めるスマホ、同じテーブルに書き込む複数のサービス、5 つのログをまたぐトレース ID、取引先に渡す推測されにくい識別子などです。共通するのは、誰もデータベースに次の番号を聞きに行きたくない、あるいは行けない状況だという点です。

一方、単一のデータベースで書き込み量が多くないなら、自動採番の bigint のほうが小さく、索引も速く、問い合わせ対応でも読みやすいです。注文番号や追跡番号のように人が読み上げる番号にも向きません。36 文字を電話で正確に伝えるのは無理があります。

生成と保存でつまずかないために

v4 は 8-4-4-4-12 の 32 桁の 16 進数です。13 文字目は必ず 4(バージョン)、17 文字目は 8・9・a・b のいずれか(バリアント)になります。この 2 か所が違えば、標準の v4 ではありません。

大文字と小文字は同じ値を指しますが、保存前にどちらかに統一してください。大文字小文字を区別する照合順序の列に混在させると、同じ ID が 2 行に分かれて永遠に一致しなくなります。小文字が無難です。Postgres の uuid 型や多くのライブラリの出力が小文字だからです。

限界:順序がばらばら、推測しにくいことは安全ではない

v4 は完全にランダムなので、挿入位置もランダムになります。索引のページ分割が増え、書き込みの多いテーブルでは追記型のキーより遅くなります。UUIDv7 は先頭にミリ秒のタイムスタンプを持ち、ULID も同じ考え方で短い表記に収めています。どちらも作成時刻で並べられます。

もうひとつの誤解は、推測しにくければ安全だというものです。UUID は失効せず、無効化もできず、発行の記録も残りません。パスワード再設定用のトークンや API キーには向きません。それらには有効期限つきで 1 回限り、サーバー側で無効化できる値が必要です。

よくある質問

UUID v4 は本当に重複しないのですか?

122 ビットがランダムです。実務上は重複しないものとして扱えます。毎秒 10 億個を何年も発行し続けても、衝突の確率はハードウェアが壊れる確率よりはるかに低いままです。実際に重複が起きるのは、文字列を切り詰めた場合や、タイムスタンプと連番を組み合わせた独自実装です。

UUID をパスワードや API キーに使えますか?

使えません。有効期限も失効の仕組みも発行記録もないため、漏えいしても止められません。36 文字は人にも扱いにくいです。有効期限と 1 回限りの制約を持つ、サーバー発行のトークンを使ってください。

UUID と自動採番、ULID はどう選びますか?

単一データベースで書き込みが多く、人が読む ID が必要なら自動採番の bigint。複数のクライアントが独立して ID を作るなら UUID。一意性を保ちながら挿入順の乱れを抑えたいなら UUIDv7 か ULID です。

関連ツール:UUID Generator