UUIDとの使い分け
ULIDの先頭48bitはUNIXミリ秒タイムスタンプ、残り80bitがランダム値です。UUID v7と設計思想が近く、辞書順ソートと生成時刻順が一致します。表記は短くて大文字英数字のみ(IとLとOとUは除外)なので、URLやログにも入れやすい形式です。
Crockford Base32 でエンコードされた 26 文字の ULID(Universally Unique Lexicographically Sortable Identifier)を生成します。 先頭 48 bit がミリ秒タイムスタンプ、残り 80 bit がランダムで、文字列ソートで時系列順に並びます。すべてブラウザ内で crypto.getRandomValues による暗号学的乱数で生成され、サーバーには送信されません。
既存のULIDを貼り付けると、先頭10文字から生成時刻を取り出します。
💡 ULID について
0123456789ABCDEFGHJKMNPQRSTVWXYZ。視認性を上げるため I / L / O / U を除外しています。crypto.getRandomValues による暗号学的に安全な乱数で生成します。Math.random() は使いません。ULID Generator は、Crockford Base32 エンコードの 26 文字 ULID をブラウザ内で生成するツールです。文字列ソートで時系列に並ぶため、ログID、イベントID、DBの主キーで時系列順を維持したい場面に向いています。
ULIDの生成はブラウザ内で行われ、crypto.getRandomValues による暗号学的乱数を使用します。生成結果はサーバーへ送信されません。
ULIDの先頭48bitはUNIXミリ秒タイムスタンプ、残り80bitがランダム値です。UUID v7と設計思想が近く、辞書順ソートと生成時刻順が一致します。表記は短くて大文字英数字のみ(IとLとOとUは除外)なので、URLやログにも入れやすい形式です。
B-treeインデックスでは、挿入順がインデックスのページ末尾に集中するほど断片化が抑えられ書き込みが安定します。完全ランダムなUUID v4と比べて、ULIDやUUID v7は近い時刻のレコードがインデックス上で近接するため、書き込み性能と読み出しキャッシュ効率の両方を高めやすくなります。
ULIDが使うCrockford Base32は、通常のBase32とは違って I・L・O・U の4文字を意図的に除外しています。理由は明快で、0 と O、1 と I と L が人間の目で見分けにくいからです(U は不適切な語が生成されるのを避けるため)。この設計のおかげで、ログに出たIDを人が読み上げたり手で書き写したりする場面でも取り違えが起きにくくなっています。生成したULIDの先頭10文字を見比べると、同じ時刻に作ったものは先頭が共通し、後半のランダム部分だけが変わるのが分かります。この先頭部分がUNIXミリ秒をBase32で表したもので、文字列を単純にソートするだけで生成順に並ぶ理由です。IDから生成時刻を復元できるということは、IDを外部に見せると作成日時も伝わるという意味でもあるので、秘匿したい場面では注意してください。
作業の流れに近いツールへすぐ移動できます。