UUID生成 — v4・v7・v5を使い分ける
重複しない識別子を作ります。用途に応じて、完全な乱数のv4、時刻順に並ぶv7、同じ入力から必ず同じ値が出るv5を選べます。貼り付けたUUIDの中身を読み解くこともできます。
UUIDは128ビットの識別子で、36文字の文字列として書かれます。データベースの主キー、ファイル名、取引の追跡番号など、「他とぶつからない名前」が必要なところで使われます。
中央のサーバーに問い合わせずに、それぞれの場所で勝手に作ってもぶつからないのが利点です。連番のように採番の順番待ちが起きません。
版の使い分け
| 版 | 性質 | 向いている用途 |
|---|---|---|
| v4 | 完全な乱数 | 迷ったらこれ。推測されたくない識別子 |
| v7 | 先頭が時刻。作った順に並ぶ | データベースの主キー |
| v5 | 同じ入力から必ず同じ値 | 名前から決まった識別子を作る |
主キーにはv7が向きます
v4は完全な乱数なので、作った順序と値の順序に関係がありません。これをデータベースの主キーにすると、新しい行が索引のあちこちに挿入され、書き込みが遅くなります。行数が増えるほど効いてきます。
v7は先頭48ビットに作成時刻(ミリ秒)が入っているため、作った順に大きくなります。索引の末尾に追加されていくので、連番に近い効率で書き込めます。ランダム性は残りの部分にあるので、推測されにくさも保たれます。
ただし時刻が読み取れるということは、いつ作られたかが分かるということです。それを隠したい用途ではv4を選んでください。
本当にぶつからないのか
v4は122ビットが乱数です。数字で書くと、103兆個のUUIDを作って初めて衝突の確率が10億分の1程度になります。実務で心配する必要はありません。
ただし、それは質のよい乱数を使っている場合の話です。このツールはブラウザの暗号用の乱数生成器を使います。予測しやすい乱数で作られたUUIDは、この保証が成り立ちません。
v5は乱数ではありません。名前空間と名前から計算されるので、同じ組み合わせからは何度でも同じUUIDが出ます。「このURLに対応する識別子」のように、決まった値がほしいときに使います。
使うときのこつ
- •まとめて生成できます。書き方はハイフンあり・なし・波かっこ・URN形式から選べます。
- •貼り付けたUUIDの版とタイムスタンプを読み解けます。v1やv7なら、いつ作られたかが分かります。
- •文字列として保存すると36バイトですが、バイナリなら16バイトです。大量に保存する場合は効いてきます。
- •生成した値は保存されません。すべてブラウザの中で作られます。
よくある質問
どの版を使えばよいですか?
データベースの主キーならv7、それ以外で迷ったらv4です。同じ入力から同じ値がほしい場合だけv5を使います。
UUIDは重複しませんか?
実務上は重複しません。v4では103兆個を作って初めて衝突の確率が10億分の1程度になります。
v7から作成時刻が分かってしまいますか?
分かります。先頭に作成時刻が入っているためです。隠したい場合はv4を使ってください。
大文字と小文字は区別されますか?
同じ値として扱うのが決まりです。表示は小文字が一般的です。
