UUIDについての誤解
はい、ヨシオリです。今日はUUIDの話をしようと思います。
なぜかというと、今、僕の脳内にめちゃめちゃUUIDについてキャッシュが載っているからですね。
何かというと、今週末にJDAGというイベントがあって、そのための資料を作っていたんですけど、
今回ちょっとUUIDで話そうかなと思っているので、それが脳内に載っているので、その話をしようと思います。
何か、今何の話をしようかなと思っているかというと、そのUUIDって、よく、789、いや678ですね。
678から時間ベースでソートが出来るようになりましたよ、みたいな感じの話をされているので、結構僕も含めて、僕も勘違いしていたんですけども、勘違いしていると思うんですけども、
じゃあ、678の前のUUID、1、2、3、4、5というのは全部時間ベースではないから、時系列でソートできなかったんだなーって思ってたんですね。
でも実は1はソートできるということが分かって面白かったので、ちょっとその話をしようと思います。
ちなみにですね、何で今この時間にポッドキャストを撮っているかというと、ちょうどUUIDの資料を書いているときですね、
678のプロポーザルが出ている、プロポーザルというかドラフトが出ているんですけども、IETFというところで、
それのドラフトのエクスパイア期限が6月9日って書いてあって、日本時間で言うと多分今日なので、明日になったら新しいのが出ているんじゃないかなと思って、
発表資料にその新しい方を貼ろうと思った段階で、ちょっと休憩してポッドキャストでも撮るかと思って今撮っている感じです。
5、6、7じゃない、6、7、8が時間でオーダーができるUUIDなんですけども、その1も実は時間でオーダーができるってなっていて、
じゃあ何で1って全然使われないんだろうっていう話をすると、その1のときって一応時間を元に作られていたんですよね、UUIDって。
UUIDってみんな見たことあると思うんですけど、4つぐらいで区切られてデータが作られているんですけども、
一番左端にあるのが時間の階32ビット、真ん中にあるのがタイムミッドっていうんですけど、次の16ビットで、
右側にあるのが上位の12ビットみたいな感じになっているんですね、その数字の上下が逆になった、上下っていうか上と階のビットが入れ替わって作られているので、
ある程度、普通に数字としてとか文字列として相当すると相当ができない。
だから、もしも相当するとなったらちゃんと分解して、まず3つ目のところを比べて、その次に真ん中を比べてみたいなことをしなくちゃいけなくて、
相当するのが大変だよねっていうので、UUID678はそうならないようにっていう風に作られています。
ちゃんと文字列として比較して相当したときに、もう既に時間順になっているみたいな風に作られています。
これも良し悪しがあって、なんでバージョン1そんな風になっているんだっていうと、これは分かるところがあって、
UUIDのバージョン
何かっていうとUUIDって基本的には完全にランダムで作られていた方が、分散DBのIDとして使ったりしたときにホットスポットとかができにくいんですよね。
時系列順になっちゃうと、やっぱりこの時間に作られたデータっていうのが一箇所に集まっちゃったりとかすると、
そこがホットスポット化するんであんまり良くないよねっていうのがあるので、基本的にUUIDが今まで考えられるときはなるべくランダムに作られるっていう風になっていたので、
そういう作り方をしていて、それは分かる。ただ、みんな使いにくい。使いにくいよね。
結局UUID時間列で相当できなくてって言って、結構逃げているっていうか使わなかったりする人が多かったので、
じゃあちゃんと時間ベースで相当しても使いやすくしましょうって言って作られたのがバージョンの6、7、8ですねっていう感じになります。
ちなみに1はそういう感じで時系列で作られていたんですけども、2とか3とか4とか5とかもあって、それぞれバージョンによっていろいろ違いがあるんですよね。
2は何かっていうと、2はセキュリティーでよく使用されるやつで、あんまりよく分かってないです。
ただ、セキュリティーでよく使われるやつだよ。よく使われていたやつもほぼ今使われてないやらしいです。
バージョン3と5ですね。バージョン3と5が文字列をベースにUUIDを生成するっていうネームベースのUUIDとか言われてるんですけど、
例えばヨシオリっていう名前からUUIDを作るみたいなことができる。これMD5のハッシュを使っているのがバージョン3で、
シャア1使っているのがバージョン5みたいな感じになります。バージョン4が完全にランダムな値を使って作るっていうUUIDで、
これが今一般的に使用されているバージョンです。なので、大体のライブラリとか言語とかでUUIDジェネレートとかUUIDニューとかってやると、
多分バージョン4で作られると思います。これランダムな形ですね。
ちなみに個体的な話をすると、時系列ベースで作られるバージョン6、7、8の中でどれを使えばいいのかっていうのが悩むところだと思うんですけども、
これも多分標準的に使われるのはバージョン7になると思います。6はバージョン1との互換性をちょっと残しておいたみたいな感じのバージョンになっていて、
8はさらに精度が高いんですけども、8はマイクロソフトとかが最初出してて、そんなに議論されてないんじゃないかな。
なので、大体みんな7で集着しようとさせてるんではないかなっていう気がしているので、
今そのUUIDを使って、しかも時系列系のもののUUIDが欲しいなと思ったらバージョン7を使うのがいいと思いますっていう、
脳内に仕様のキャッシュが残っているとベラベラベラベラしゃべれるよねっていう話でした。
じゃあ。