Oh MyUtils

ULIDジェネレーター - ソート可能なユニークID生成 オンライン

ULIDの生成、タイムスタンプの抽出、ULIDとUUID間の変換。厳密な順序付けのためのモノトニック生成 — 100%クライアントサイド、サーバーへのデータ送信なし。

モノトニック
大文字

一括生成

数量

よくある質問

ULIDとは何ですか?

ULID(Universally Unique Lexicographically Sortable Identifier)は、CrockfordのBase32を使用して26文字の文字列としてエンコードされた128ビットの識別子です。従来のUUIDとは異なり、ULIDは最初の10文字に48ビットのUnixタイムスタンプ(ミリ秒単位)を埋め込み、残りの16文字に80ビットの暗号学的ランダム値を含みます。この設計により、ULIDはグローバルな一意性を維持しながら、作成時刻順に辞書式ソートが可能です。

このULIDジェネレーターはどう使いますか?

生成タブで単一またはバルクULID(最大1000個)を作成できます。同一ミリ秒内での厳密な順序を保証するにはMonotonicモードをオンにしてください。デコードタブでは任意のULIDを貼り付けて、埋め込まれたタイムスタンプ(ISO 8601、Unixミリ秒、ローカル時刻)を抽出できます。変換タブではULIDとUUID形式を相互変換できます。コピーボタンをクリックして結果をクリップボードにコピーしてください。

データは安全ですか?サーバーに送信されますか?

すべての操作はWeb Crypto API(crypto.getRandomValues())を使用して100%ブラウザ内で実行されます。ULIDデータ、タイムスタンプ、UUIDがサーバーに送信されたり、データベースに保存されたり、どこかに記録されることは一切ありません。インターネット接続を切断しても完全に動作することで確認できます。

ULIDとUUIDの違いは何ですか?

どちらも128ビットの識別子ですが、主な違いがあります。ULIDは26文字(CrockfordのBase32)、UUIDは36文字(ハイフン付き16進数)です。ULIDは作成時刻順に辞書式ソートが可能ですが、UUID(v4)はランダム順です。ULIDには特殊文字が含まれず、URLセーフです。どちらも128ビット値であるため、ULIDとUUID間の相互変換が可能です。

Monotonic ULID生成とは何ですか?

同一ミリ秒内に複数のULIDを生成する場合、標準的な生成方式では毎回ランダムな値を割り当てるため、ULIDの順序が保証されない場合があります。Monotonic生成は、同一ミリ秒内で生成される各ULIDのランダム部分を1ずつ増加させることでこの問題を解決し、厳密な辞書式順序を保証します。これはIDの順序に依存するデータベースシステムにとって重要です。

UUIDの代わりにULIDをいつ使うべきですか?

別のタイムスタンプカラムなしで時刻順ソート可能な識別子が必要な場合、データベースインデックスの性能向上(B-treeフレンドリー)、より短い文字列表現(26文字 vs 36文字)、URLセーフな識別子が必要な場合にULIDを使用してください。最大限のエコシステム互換性、RFC準拠、組み込みのバージョン/バリアントメタデータが必要な場合はUUIDを使用してください。

コード例

// Crockford's Base32 alphabet
const ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';

// Generate a ULID
function generateULID() {
  const timestamp = Date.now();
  let ts = timestamp;
  let timestampPart = '';
  for (let i = 9; i >= 0; i--) {
    timestampPart = ENCODING[ts % 32] + timestampPart;
    ts = Math.floor(ts / 32);
  }

  const randomBytes = new Uint8Array(10);
  crypto.getRandomValues(randomBytes);
  const bits = Array.from(randomBytes)
    .map(b => b.toString(2).padStart(8, '0')).join('');
  let randomPart = '';
  for (let i = 0; i < 16; i++) {
    randomPart += ENCODING[parseInt(bits.slice(i*5, i*5+5), 2)];
  }

  return timestampPart + randomPart;
}

console.log(generateULID()); // "01ARZ3NDEKTSV4RRFFQ69G5FAV"

関連ツール