UUID生成
バージョン4またはバージョン7のUUIDをブラウザ内で生成します。1つずつでも、100個まとめてでも生成できます。
すべてブラウザ内で動作します。アップロード、記録、保存は一切行いません。
UUIDは128ビットの識別子で、中央の管理機関に問い合わせることなくどこででも生成でき、それでも一意であると期待できます。ここでは2つのバージョンを用意しています。それぞれ別の問題を解決するからです。
仕組み
バージョン4は122ビットのランダム値で、6ビットがバージョンとバリアントを示すために固定されています。情報を何も持たないことは、公開する識別子にはまさに望ましい性質ですが、クラスター化された主キーとしては不向きな理由でもあります。連続して挿入した行が、インデックス内の無関係な位置に散らばるからです。
RFC 9562で標準化されたバージョン7は、ミリ秒単位の48ビットのタイムスタンプを74ビットのランダム値の前に置きます。後から生成した値は先に生成した値より後ろに並ぶので、挿入はインデックスの末尾に収まり、時間範囲での検索も機能します。その代わり、識別子から作成日時がわかってしまいます。
ランダムなビットは、鍵の生成にも使われるブラウザの暗号論的乱数生成器から取得しており、Math.randomは使っていません。
よくある質問
v4とv7のどちらを使うべきですか?
データベースの主キーにはv7を。順序がインデックスを健全に保ちます。識別子が外部に公開され、作成日時を漏らしてはならない場合や、順序から1時間あたりの作成件数を推測されてしまう場合にはv4を使ってください。
2つのUUIDが重複することはありますか?
理論上はありえますが、v4では実際上ありえません。122ビットのランダム値では、重複が起きそうになるまでに毎秒数十億個を1世紀にわたって生成し続ける必要があります。本当のリスクは弱い乱数源であり、だからこそここでは暗号論的な乱数源を使っています。
v1はどうですか?
バージョン1は生成したマシンのMACアドレスを埋め込むので、ハードウェアの身元が漏れます。v7はそれなしで同じ時系列順を実現する、v1の現代的な後継です。
知っておきたいこと
- 値はブラウザ内で生成され、どこにも送信されません。
- このツールは決定的ではありません。ページを再読み込みすると新しい識別子が得られます。それこそが目的です。