Laravel UUID、ULID で遊んでみる

27075 ワード

前書き

Laravel Ver.9.30.1、9.31.0 で、UUID / ULID 関係の機能が追加されましたので、その機能で遊んでみた内容を記事にしたいと思います。

UUID and ULID support for Eloquent #44074
Improve UUID and ULID support for Eloquent #44146

上記の機能追加は、主に、

  • Eloquent モデルに対するトレイトの提供
  • ULID のサポート

という感じになると思います。

なお、UUID / ULID を id の代わりのプライマリキーにしたり、又は id とは別の項目として持たせる事も上記のトレイトでは対応可能になっています。

という事で、まずは予習(or 復習)から。

UUID / ULID とは?

詳しくは下に掲げた参考リンクなどを参照いただきたいのですが、私なりにざっくりまとめさせていただきますと…。

UUID(Universally Unique Identifier)とは、ソフトウェア上でオブジェクトを一意に識別するための識別子である。UUIDは128ビットの数値だが、16進法による550e8400-e29b-41d4-a716-446655440000というような文字列による表現が使われることが多い。(wikiより)

ざっくり、重複する恐れは天文学的に低いので、安心して使用できるIDという感じですね。RFC 4122として規格化されています。

一方、ULID(Universally Unique Lexicographically Sortable Identifier)は、コミュニティ(or 草の根)的な規格で、UUIDと互換性を持たせる形で作られつつも、UUID Ver.4 では、ソートできないのに対し、ULID は、先頭48ビットにタイムスタンプを置くことにより、ソート可能となっている、という感じですね。

また UUID は、16進表記の32文字で表現されるのに対し、ULID は、26文字のエンコードされた文字で表現されるという違いがあります。例えば、下記みたいな感じです。

UUID(Ver.4)
ca004cbd-a728-4232-90db-d9a2a31d3c80

ULID
01GDFVRZW5YKKGDFTFQCM6BDF5

ULID の短いのは良いですね。ですが、UUID も何かちょっと格好良い?

参考リンク(参考にさせていただいた記事等)

https://ja.wikipedia.org/wiki/UUID
https://qiita.com/kai_kou/items/b4ac2d316920e08ac75a
https://blog.daveallie.com/ulid-primary-keys
https://techblog.raccoon.ne.jp/archives/1627262796.html
https://qiita.com/kawasima/items/6b0f47a60c9cb5ffb5c4
https://asnokaze.hatenablog.com/entry/2021/04/28/030550
https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-04.html#name-uuid-version-7

UUID のバージョン

UUID には、バージョンがあり、現在は Ver.4 が主流と言えます。UUID Ver.4 は、バージョン情報などの6ビットを除けば、完全ランダムな値になっています。

ですが、ここに来て、UUID を生成する PHP 用のライブラリが、Ver.7 に対応されてきました。
Ver.7 は、ULID のように先頭にタイムスタンプ情報を持つことにより、ソート可能な ID が生成されるようになっています。

Laravel の Ver.4 と言いつつソート可能な Ver.7風 UUID

UUID Ver.4 は、本来、完全ランダムな値なのですが、Laravel では、ソート可能な UUID Ver.4(Ver.7風)が利用可能になっています。

(Ver.4 と言いつつ、完全ランダムではないので、もはや Ver.4 の規格と違うのではないか、という噂もありますが…。個人的には、これが一体何なのか、よく分かっていません😅 Laravel オリジナルという感じ❓)

本題

という事で、UUID / ULID を試してみたいと思います。
まずは、執筆時点の最新の Ver.9.31.0 をインストールします。

本題に進む前に、今回試す内容を書きたいと思います。

  1. UUID Ver.4 を今回の新機能を使わずに試す
  2. UUID Ver.4 を今回の新機能を使って書き直す
  3. UUID Ver.7 を使ってみる
  4. ULID を使ってみる

となります。
UUID / ULID は、id の代わりのプライマリキーとして作成してみたいと思います。

1. UUID Ver.4 を今回の新機能を使わずに試す

実は Laravel では、Str::uuid() を呼び出す事で、UUID を得ることができるようになっています。

改めて調べて見ると、、、Ver.5.6 の時から利用できるようですね。