現代のソフトウェア開発では、Unique Identifier はシステムを構成する重要な要素です。データベースの主キー、API リソース識別子、ユーザー ID、注文番号、ファイル名など、さまざまな場面で一意な識別子を確実に生成する仕組みが必要になります。
UUID:最も広く使われる標準
UUID(Universally Unique Identifier)は 128 bit の識別子規格(RFC 4122)です。中央の調整機構を使わずに世界規模で一意性を確保できるよう設計されています。最も一般的な UUID v4 は完全に乱数へ依存し、新しい UUID v7 はタイムスタンプと乱数を組み合わせることで時系列に並べやすい性質を備えています。
UUID の強みは標準化の度合いが非常に高く、ほぼすべてのプログラミング言語やデータベースで標準的に扱えることです。そのため、システムや言語をまたぐ用途に適しています。一方、36 文字という長さは用途によっては冗長で、完全にランダムな v4 はデータベースインデックスとの相性があまり良くありません。
ULID:ソート可能な ID の現代的な代替手段
ULID(Universally Unique Lexicographically Sortable Identifier)は、UUID が時系列に並べにくい問題を解決するため、Alizain Feerasta によって 2016 年に提案されました。ULID も 128 bit ですが、26 文字の Crockford Base32 文字列として表現されます。先頭のタイムスタンプにより辞書順ソートが作成時刻順と一致し、同一ミリ秒内でも最大 2^80 通りの一意な値を生成できます。
Crockford Base32 は I、L、O、U など見間違えやすい文字を除外しているため、人が読む場合や手入力する場合の誤りを減らせます。ULID は大文字・小文字を区別しないため、URL で扱う場合にも使いやすい形式です。
Nano ID:軽量で効率的な solution
Nano ID は Andrey Sitnik(PostCSS と Autoprefixer の作者でもあります)が開発した、フロントエンド分野で非常に人気の高い ID ジェネレーターです。UUID や ULID と異なり、Nano ID は固定形式の標準ではなく、カスタマイズ可能な実装です。中心的な設計思想は「最小のサイズで十分な一意性を提供する」ことです。
Nano ID は A-Z、a-z、0-9、-、_ を含む 64 文字の URL セーフなアルファベットを使用し、標準の 21 文字で UUID v4 と同程度の 126 bit のランダム性を確保します。length パラメータを変えることで、安全性と短さのバランスを柔軟に調整できます。
CUID2:水平方向に拡張された衝突回避方式
CUID2 は Eric Elliott が開発した CUID の第 2 世代で、Horizontal Scaling を前提に設計されています。CUID2 は内部で増分カウンター、ランダムなフィンガープリント、ハッシュ関数を組み合わせ、中央の調整役が存在しない分散システムでも衝突しにくい ID を生成します。
CUID2 の既定長は約 24 文字で、エンコードされた fingerprint 情報を含みます。そのため、2 台のサーバーが同じミリ秒内に ID を生成しても、結果は完全に異なります。こうした性質から、CUID2 はマイクロサービス構成や serverless アプリに適しています。
どう選ぶ?実用的な提案
新しい PostgreSQL または MySQL table を作成し、UUID を primary key として使う場合、UUID v7 を選択することを強く推奨します, index fragmentation を大幅に減らせます。ID を外部公開し、さらに短くしたい場合は、ULID または Nano ID より適した選択肢です。非常に高い security requirement がある horizontal scaling scenario では、CUID2 collision に対する追加保護を提供します。
どの形式を選んでも、ToolHub の ID Generator ですばやくテストデータを生成し、衝突確率 Calculator を使ってその選択が業務要件に合うか確認できます。