"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

uuid(universally unique IDentifiers)についてざっくり整理

f:id:arakan_no_boku:20220320212014p:plain

目次

uuid(universally unique IDentifiers)

訳すと「ユニバーサルユニークID」とは「普遍的に一意な識別子」。

その名の通り、世界中で重複がないユニークな値となり、その一意性が中央サーバーなどの要素に依存しないように設計されているIDです。

その精度は、理論上は例えば100年間ずっと毎秒10億個のUUIDを作成した場合でも重複するUUIDが生成される可能性は約50%。10兆個のUUIDを生成した場合だと重複する可能性は0.00000006%だそうです。

現代の多くのUUIDの実装はIETFRFC 4122に基づいています。

datatracker.ietf.org

このRFC 4122では5つの異なる生成方法が定義されています。

UUIDは128ビットのビット列となっており、一般的にはこのビット列を16進数表記して、8-4-4-4-12の形式で表示します.

形式としては。

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

となります。

このMとNであらわされた部分には意味があります。

Nの位置は、そのuuidがRFC 4122に基づいたものかどうかを示します。

RFC 4122に基づいたUUIDはNの位置が「8」「9」「A」「B」のどれかになります。

Mの位置はバージョンです。

uuidを生成する方法には以下の5つがあります。

f:id:arakan_no_boku:20220320215547p:plain

Mの位置の数字は、このどれで生成されたかを示してます。

ちなみに、現在、一番使われているのばバージョン4です。

それを踏まえて、このサンプルを見れば

3422b448-2460-4fd2-9183-8000de6f8343

このuuidは、RFC4122に基づきバージョン4で生成したuuidであることがわかります。

 

uuidの生成

正直言えば。

uuidは、例えば「iBeacon」というBlueTooth通信を使ったサービスのパケットに含まれているみたいに、すでに割り当てられたものを受け取ってDBでキー情報として管理するようなケースがほとんどで、自分でuuidを生成するような場面はほぼありません。

分散された環境でそれぞれ生成してもユニークにしなければならない要件のアプリケーションなんて30年以上システム開発の仕事をやっていて、一度もお目にかかったことはないですし、クローズされた環境内でユニークなキーを作るだけなら、別のもっと簡単な方法がたくさんありますから。

なのですが。

とりあえず、やり方だけ調べておきます。

PHPでuuidを生成

標準ライブラリではできません。

外部ライブラリをインストールして使う必要があります。

主だった外部ライブラリとしては。

ramsey/uuid

github.com

webpatser/laravel-uuid

github.com

なんかがあります。

インストールすれば、以下のような感じで簡単に使えるようです。

use Ramsey\Uuid\Uuid;                         
$uuid = Uuid::uuid4();  

詳しくは、上記GitHubのドキュメント・ソースを見て確認できます。

ただ、テスト用とかの用途で使うだけなら、そのためだけに外部ライブラリをインストールしなくても、以下の記事を参考にして標準ライブラリだけを使って「なんちゃってUUID」を生成しても、いいんじゃないかなと、僕は思います。

qiita.com

ただ、Pythonとかだと簡単に生成できるので、僕の場合は先にテストで必要になりそうな数のuuidをPythonで生成してストックしておいて、それを割り当てる方法をとっていますけど。

Pythonでuuidを生成

RFC 4122に沿った正しいuuidを生成するモジュールが標準で提供されてます。

Pythonはさすがです。

docs.python.org

使い方も非常に簡単です。

import uuid

print(uuid.uuid4())

これだけで、以下のようなバージョン4で生成したuuidが表示されます。

90680063-0387-487f-ab82-81e309a4a06d

今回はこんなところで。

ではでは。