CUID2ジェネレーター

Generate secure next-generation CUID2 identifiers

件数
長さ

生成された CUID2

「生成」をクリックして CUID2 を作成

CUID2とは何ですか?

CUID2(Collision-resistant Unique ID、バージョン2)はCUID v1の次世代後継者で、データベース、URL、分散システムの主キーとして安全に使用できる短く、暗号的に安全で不透明なIDを生成するよう設計されています。

前身とは異なり、CUID2は作成時刻、ホストマシン、生成したプロセスに関する情報を一切明かしません。各IDはランダムな小文字で始まり、SHA-512から派生したbase-36ハッシュが続く、一見ランダムな文字列です。デフォルト長は24文字ですが、ストレージ制約に合わせて2〜32文字の間で設定できます。

CUID2は現代のデータベースツールキットに広く推奨されています。Prismaは @default(cuid()) スカラーのデフォルトID戦略として採用し、PlanetScale、Neon、その他のサーバーレスデータベースプロバイダーはCUID2を推奨IDフォーマットとして明示しています。

CUID2がCUID v1を置き換えた理由

2012年にEric Elliottがリリースしたいたd CUID v1は、クライアントサイドID生成における単純なUUIDに対する大きな改善でした。しかし、セキュリティ研究者がその設計に2つの根本的な問題を発見しました:

  • フィンガープリンティング:すべてのCUID v1値に埋め込まれたホストフィンガープリントを使用して、IDを生成したマシンまたはプロセスを特定でき、IDを観察できる誰にでも操作上のメタデータが漏洩します。
  • 予測可能性:CUID v1が単調増加カウンターとタイムスタンプセグメントを含んでいたため、複数のIDを観察した攻撃者が将来のIDのおおよその範囲を予測でき、IDを唯一の認証チェックとして使用するAPIに対する列挙攻撃が可能になります。
  • 非暗号ハッシュ:CUID v1は現代のセキュリティ標準を満たさない単純な非暗号ハッシュステップを使用していました。

元の作者Eric Elliottは、CUID v1を正式に非推奨とし、これらの問題をすべて解決するためにCUID2をゼロから開発しました。新しいアルゴリズムはWeb Crypto API(SHA-512)を使用し、すべての決定論的コンポーネントを排除します。

CUID2の設計原則

予測不可能
タイムスタンプ、カウンター、ホストフィンガープリントは一切埋め込まれません。各IDは、新鮮な暗号ランダムソルトとSHA-512の組み合わせから生成されます。
フラット分布
SHA-512ダイジェストのbase-36エンコードにより、ほぼ均一な文字分布が生成され、B木データベースのインデックスホットスポットが削減されます。
デフォルトでURL安全
アルファベットは小文字a〜zと数字0〜9に制限されており——ハイフン、アンダースコア、大文字なし——パーセントエンコードなしにURLで安全なIDになります。
設定可能な長さ
長さ(2〜32)を選択します。短いIDほど衝突確率が高くなります;推奨されるデフォルト値24は約4 × 10³⁷の一意値を提供します。
常に文字で始まる
最初の文字は常にランダムな小文字で、CUID2値がエスケープなしに有効なHTML要素IDおよびCSSセレクターになることを保証します。
サーバー不要
CUID2はすべての最新ブラウザーとNode.js 15+で利用可能なWeb Crypto APIのみに依存するため、サーバーと同じセキュリティ保証でクライアントサイドでIDを生成できます。

CUID2 vs CUID v1——比較

以下の表は、CUID2と現在非推奨のCUID v1の主な違いをまとめています。現在CUID v1を使用している場合は、CUID2への移行を強くお勧めします。

属性CUID2CUID v1
セキュリティ暗号(SHA-512)非暗号(フィンガープリントベース)
予測可能性不透明——メタデータ漏洩なしタイムスタンプ + フィンガープリントがIDに見える
長さ設定可能(2〜32文字)固定25文字
プレフィックスランダム文字a〜z常に「c」で始まる
分布フラット / 均一単調増加セグメント
ステータス積極的にメンテナンス元の作者により非推奨

CUID2 vs UUID v4——比較

UUID v4はランダムなユニークIDの主要標準です。CUID2はセキュリティを犠牲にすることなくUUID v4に対していくつかの実用的な利点を提供します。

属性CUID2UUID v4
デフォルト長24文字36文字(ハイフン付き)
URL安全はい——小文字a〜z + 0〜9エンコード必要(ハイフンを含む)
カスタム長はい(2〜32)いいえ——常に128ビット / 36文字
ソート可能いいえ(設計上)いいえ(v4はランダム)
エントロピーソースSHA-512 + Web CryptoCSPRNG
文字セットBase-36(a〜z, 0〜9)16進数 + ハイフン

主なトレードオフは親しみやすさです:UUID v4はIETF標準(RFC 4122)で、ほぼすべてのデータベース、プログラミング言語、APIフレームワークで即座に認識されます。CUID2は成長しているが普遍的でないサポートを持つコミュニティ標準です。外部システムとの相互運用性が最重要の場合はUUID v4を選択し;両端を制御していて短くURL安全なIDを好む場合はCUID2を選択してください。

CUID2を使用しているのは誰ですか

CUID2は現代のJavaScriptおよびTypeScriptエコシステムで急速に採用されています:

  • Prisma——最も人気のあるTypeScript ORMは、Prisma Schema v2+の @id フィールドに @default(cuid()) とともにCUID2を推奨デフォルトとして使用します。
  • PlanetScale——ドキュメントとスターターテンプレートは、分散MySQLプラットフォームでのシーケンシャルスキャンのパフォーマンス問題を避けるためにアプリケーション生成の主キーにCUID2を推奨しています。
  • Drizzle ORM——列定義用のビルトインデフォルトヘルパー cuid2() を提供します。
  • tRPCボイラープレート——多くのコミュニティtRPC + Prismaスターターテンプレートは主キー戦略としてCUID2とともに提供されています。
  • T3 Stack——create-t3-appスキャフォールディングツールは生成されたスキーマファイルでCUID2デフォルトを持つPrismaを使用します。

コード例

公式npmパッケージ @paralleldrive/cuid2 がシンプルなAPIを提供します:

JavaScript (npm — @paralleldrive/cuid2)
import { createId } from '@paralleldrive/cuid2'

// Generate a single CUID2 (default length: 24)
const id = createId()
console.log(id) // e.g. "tz4a98xxat96iws9zmbrgj3a"

// Custom length
import { init } from '@paralleldrive/cuid2'
const createShortId = init({ length: 16 })
const shortId = createShortId()
console.log(shortId) // e.g. "tz4a98xxat96iws9"

PrismaスキーマでCUID2を使用する:

Prisma Schema
model User {
  id        String   @id @default(cuid())
  email     String   @unique
  name      String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

npmパッケージなしでNode.jsでCUID2を生成する(Web Crypto APIのみを使用、このツールがブラウザーで行うように):

Node.js (Web Crypto — no dependencies)
async function generateCuid2(length = 24) {
  const alphabet = 'abcdefghijklmnopqrstuvwxyz'

  // Random prefix letter
  const firstByte = crypto.getRandomValues(new Uint8Array(1))[0]
  const firstChar = alphabet[firstByte % 26]

  // Random 32-byte salt
  const salt = crypto.getRandomValues(new Uint8Array(32))
  const saltHex = [...salt].map(b => b.toString(16).padStart(2, '0')).join('')

  // SHA-512 of timestamp + salt
  const input = Date.now().toString(36) + saltHex
  const hashBuffer = await crypto.subtle.digest(
    'SHA-512',
    new TextEncoder().encode(input)
  )

  // Encode hash bytes as base-36 string
  const bytes = new Uint8Array(hashBuffer)
  let hash = ''
  for (let i = 0; i < bytes.length; i += 8) {
    let chunk = 0n
    for (let j = 0; j < 8 && i + j < bytes.length; j++) {
      chunk = (chunk << 8n) | BigInt(bytes[i + j])
    }
    hash += chunk.toString(36)
  }

  return (firstChar + hash).slice(0, length)
}

// Usage
const id = await generateCuid2()
console.log(id) // e.g. "m7k3r9p2nxq8zt5a6cwj4bvd"

よくある質問

CUID2はCUID v1と後方互換性がありますか?
いいえ。CUID2 IDはCUID v1 IDとまったく異なります。CUID v1は常に文字「c」で始まり、固定長25文字です。CUID2はランダムな文字で始まり、設定可能な長さ(デフォルト24)を持ちます。既存のデータベースを移行する場合は、両方のフォーマットを処理するか、すべてのCUID v1値を置き換えるマイグレーションを実行する必要があります。
どの長さを使うべきですか?
デフォルトの24文字がほとんどのアプリケーションに推奨される選択です。大規模でも統計的に不可能な衝突を生み出す約4 × 10³⁷の一意値を提供します。ストレージが重要で数十億レコード未満のデータセットの場合は16文字を使用してください。最大のセキュリティマージンには32文字を使用してください。
CUID2は作成時刻でソート可能ですか?
いいえ——これは意図的です。CUID2は列挙攻撃とフィンガープリンティングを防ぐために、すべての時間情報を意図的に破棄します。時間順のIDが必要な場合は、代わりにULIDまたはUUID v7を検討してください。CUID2はソート可能性をセキュリティと不透明性と交換します。
CUID2 vs NanoID——どちらを選ぶべきですか?
どちらも安全でURL安全です。NanoIDはデフォルトで21文字とやや短く、より大きなアルファベット(A〜Za〜z0〜9_-)を使用して1文字あたりより多くのエントロピーを提供します。CUID2は制限されたアルファベット(a〜z, 0〜9)を使用し、CSSセレクターでより安全で、常に文字で始まります。最大エントロピー密度が必要ならNanoIDを選択し;Prisma/ORM統合またはCSS安全なIDが重要ならCUID2を選択してください。
CUID2はURL安全ですか?
はい。CUID2は小文字(a〜z)と数字(0〜9)のみを使用します。ハイフン、アンダースコア、プラス記号、スラッシュ、等号を含まないため、エンコードなしにURL、HTML id属性、CSSセレクター、ファイル名に直接埋め込むことができます。
CUID2をデータベースの主キーとして使用できますか?
はい、これは主要なユースケースの1つです。CUID2は自動インクリメント整数のシーケンシャルパターン(行数を漏洩し列挙を可能にする)を避け、UUIDより短く(インデックススペースを節約)、URL安全です。ほとんどのデータベースはVARCHAR(24)またはTEXT列として保存します。ULIDやUUID v7とは異なり、CUID2値は時間順ではないため、挿入順スキャンに大きく依存するクエリがある場合はソート可能な代替案を好むかもしれません。