時刻でソート可能な ID として ULID を生成する
ULID(Universally Unique Lexicographically Sortable Identifier)はタイムスタンプとランダムデータを組み合わせ、作成時刻順にソートされる ID を生成します。
- 1
ULID は 26 文字の文字列です:タイムスタンプ(ミリ秒、48 ビット)に 10 文字+ランダム性(80 ビット)に 16 文字。ULID は辞書式でソート可能です。ULID を文字列としてソートすると、作成時刻順に並びます。これはデータベースインデックス(時間順)、ログエントリ、イベントソーシングに価値があります。ULID は URL セーフです(Crockford Base32 アルファベット:0-9A-Z、I、L、O、U を除外)。
- 2 UUID / ULID ジェネレーター →
比較のために UUID を生成します。UUID v4 はランダムなので、ソートしても意味のある順序になりません。ULID は時間でソートされます。時間順のレコードがキャッシュ局所性と範囲クエリの性能を向上させるデータベース主キーに有用です。純粋な一意性には UUID を、時間順序が重要な場合には ULID を使ってください。
- 3 タイムスタンプコンバーター →
ULID の時間コンポーネントを理解するために、現在のタイムスタンプを取得します。ULID の最初の 10 文字がミリ秒タイムスタンプをエンコードします。これにより ULID はデコード可能です。データベースを参照せずに作成時刻を抽出できます。デバッグとログ分析に使ってください。
- 4 Base62 エンコーダー →
代替のソート可能 ID として、タイムスタンプ+乱数を Base62 でエンコードします。ULID に似ていますが、より大きなアルファベット(32 文字に対し 62 文字)で短い ID を生成します。ただし、ULID の Crockford Base32 の方が堅牢(紛らわしい文字なし)で標準化されています。
よくある質問
- データベースキーには ULID と UUID のどちらですか?
- 時間順のレコードが必要なら ULID を使ってください(インデックスの局所性、範囲クエリ、時系列ソートが向上)。純粋なランダム性が必要なら(タイミング情報の漏えいなし)UUID v4 を使ってください。ULID の標準化された代替としては UUID v7(時間順、RFC 9562)があります。ULID は 26 文字、UUID は 36 文字(ハイフン付き)または 32 文字(なし)です。
- ULID はタイミング情報を漏らしますか?
- はい。最初の 10 文字がミリ秒タイムスタンプをエンコードし、ID がいつ作られたかを明らかにします。ほとんどのアプリケーションでは問題ありません(作成時刻は秘密ではない)。プライバシーに敏感なアプリケーション(匿名投稿、医療記録)では、ランダム ID(UUID v4、NanoID)を使ってください。実際の時刻を隠すために、ランダムな開始時刻(オフセット)付きの ULID を使う方法もあります。