はじめに
業務内で「UUID」という言葉が出てきたのですが、聞いたことあるけど何だこれは状態だったので、この「UUID」について基本的な部分を掘り下げてまとめていきたいと思います。
UUID とは?
UUID とは Universally Unique Identifier の略です。
直訳すると「普遍的に重複しないID」になり、意味としてはほぼそのままで、将来にわたって重複や偶然の一致が起こらないという前提で使われるIDのことを言います。
UUID は RFC で仕様が規定されていて、生成方法の違いによりいくつかのバージョンが存在します。
今日、よく使用される UUID v4 は、疑似乱数によって生成されています。
UUID は 以下のような 128 ビットの値で、標準的には以下のようなハイフン 5 つに区切られた 16 進数の文字列です。
123e4567-e89b-12d3-a456-426614174000
UUID は本当に重複しないのか?
UUID は普遍的に重複しない、そんなことは可能なのでしょうか?
可能性が低すぎて可能なのです。
どういうことかというと、理論的に重複する可能性はあるけど、実際には重複する確率が極めて低いため、実用上は重複しないと考えられています。
どれぐらい低いかというと、理想的な暗号学的乱数を使用した場合、衝突確率が 0.5 になるまでに約 230 京回の生成が必要となるぐらいです。(あくまで理論値)
とりあえず限りもなく小さい可能性であることは理解できるかなと思います。
他のバージョンや似たような概念について
使用頻度の高い UUID v4 について、上述しましたが他のバージョンや似たような概念があります。
UUID v7
UUID v4 と同様に 128 ビットのランダムな識別子です。
UUID v7 は現在時刻を表すナノ秒単位のタイムスタンプに基づいて生成されるので、生成時刻を基準にソートすることができるのが v4 との違いです。
ULID(Universally Unique Lexicographically Sortable Identifier)
UUID の欠点を補う形で設計された一意識別子です。
先頭 48 ビットにタイムスタンプを置くことでソート可能となっています。
残りの80ビットがランダムな値になります。
識別子のフォーマットは以下のようになります
01GWKR0SQ0KD0QZ3SHEEAM8YDJ
UUID よりも短く、可読性が高いことがわかります。
上記のように、UUID と ULID にはそれぞれ特徴があるので、この特徴を理解した上で適切なユースケースで使っていきたいものです。
最後に
UUID についてまとめていく中で、理論上絶対ではないが、現実にはまず発生しない、発生させようとしたら途方もない時間がかかる状態を作り上げることで「発生」しないとみなす考え方(計算量的安全性)を知ることができました。
言葉の意味を知るだけでなく、その裏にある考え方まで理解する意識をこれからも持ちたいと思いました。
参考文献