CUID2 Generator

Menghasilkan pengenal CUID2 generasi berikutnya yang aman

Jumlah
Panjang

CUID2 yang Dibuat

Klik Buat untuk membuat CUID2

Apa itu CUID2?

CUID2 adalah generasi kedua dari CUID, ditulis ulang dari awal dengan fokus pada keamanan kriptografi dan privasi.

Tidak seperti CUID v1 yang menyematkan timestamp secara terlihat, CUID2 menyembunyikan semua komponennya di dalam hash SHA3, menghasilkan string yang secara praktis tidak dapat diprediksi.

ID dimulai dengan prefix huruf yang dapat dikustomisasi (default c) diikuti dengan string base36 dari hash SHA3.

Mengapa CUID2?

CUID2 hadir sebagai respons terhadap kekhawatiran keamanan spesifik di CUID v1:

  • Timestamp yang terekspos: CUID v1 mengungkapkan waktu pembuatan di awal setiap ID.
  • Prediktabilitas: Dengan pengetahuan tentang struktur CUID v1, sebagian state internal dapat disimpulkan.
  • Kurangnya keamanan kriptografi: CUID v1 tidak secara eksplisit menggunakan generator bilangan acak yang aman secara kriptografi.

CUID2 mengatasi masalah ini dengan menggunakan SHA3, CSPRNG, dan penyembunyian timestamp.

Prinsip Desain

Keamanan Kriptografi
Menggunakan CSPRNG dan SHA3 untuk memastikan ID tidak dapat diprediksi bahkan dengan mengetahui kerangka waktu.
Privasi Timestamp
Timestamp dicampur ke dalam hash dan tidak muncul secara langsung, melindungi privasi timing.
Prefix yang Dapat Dikustomisasi
Tentukan prefix kustom untuk membedakan ID dari berbagai jenis entitas (mis. usr_, prd_).
Panjang yang Dapat Dikustomisasi
Panjang default 24 karakter tetapi dapat disesuaikan dengan kebutuhan aplikasi.
Fingerprint Bersama
Berbagi nilai fingerprint acak di seluruh pemanggilan fungsi untuk distribusi entropi yang lebih baik.
Kompatibel dengan Database
Selalu dimulai dengan huruf alfabet, kompatibel dengan nama variabel dan constraint database.

CUID2 vs CUID v1

Perbandingan karakteristik kunci antara kedua generasi:

AtributCUID2CUID v1
KeamananKriptografi (SHA3+CSPRNG)Non-kriptografi
PrediktabilitasSangat rendahRendah (timestamp terekspos)
PanjangDapat dikustomisasi (default 24)25 karakter tetap
PrefixDapat dikustomisasiTetap 'c'
DistribusiTerdistribusi merataBias timestamp
StatusAktif & direkomendasikanUsang

CUID2 vs UUID v4

Perbandingan dengan standar UUID yang umum:

AtributCUID2UUID v4
Panjang Default24 karakter36 karakter
URL-safeYaYa (dengan tanda hubung)
Panjang KustomYaTidak
SortableTidakTidak
EntropiTinggi (SHA3)Tinggi (CSPRNG)
Set KarakterAlfanumerik huruf kecilHex + tanda hubung

CUID2 menyediakan prefix alfabet yang terjamin dan panjang yang fleksibel dengan keamanan setara UUID v4.

Siapa yang Menggunakan CUID2?

CUID2 telah diadopsi oleh komunitas dan framework terkemuka:

  • Prisma mendukung CUID2 sebagai tipe ID di field @id melalui @default(cuid()).
  • Komunitas Drizzle ORM mengadopsi CUID2 untuk ID default.
  • Proyek SvelteKit dan Remix menggunakannya untuk ID sesi.
  • Server API volume tinggi yang membutuhkan ID yang dapat dilacak dalam log.
  • Aplikasi yang menyinkronkan di beberapa database atau region.

Contoh Kode

Instalasi dan penggunaan: pnpm add @paralleldrive/cuid2

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"

Konfigurasi lanjutan:

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

Integrasi database:

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"

FAQ

Apakah CUID2 lebih lambat dari CUID v1 karena SHA3?
Sedikit — SHA3 lebih lambat dari algoritma kustom CUID v1, tetapi perbedaannya tidak terlihat di sebagian besar aplikasi. CUID2 menghasilkan puluhan ribu ID per detik, jauh lebih cepat dari round-trip database yang khas.
Bisakah saya upgrade dari CUID v1 ke CUID2 tanpa migrasi data?
Anda bisa menambahkan kolom CUID2 dan beralih secara bertahap untuk record baru. Jika menggunakan CUID sebagai primary key, Anda memerlukan rencana migrasi karena formatnya berbeda.
Seberapa banyak entropi yang dimiliki CUID2?
Pada panjang default 24 karakter, CUID2 menyediakan sekitar 118 bit entropi — lebih dari UUID v4 (122 bit acak, tetapi beberapa ditentukan untuk versi). Panjang kustom menyesuaikan entropi secara linear.
Apakah CUID2 cocok untuk ID yang berorientasi privasi?
Ya — tidak seperti CUID v1, CUID2 tidak membocorkan waktu pembuatan atau informasi host. Timestamp dicampur ke dalam hash dan tidak dapat diekstraksi dari ID saja.
Apa panjang CUID2 yang optimal?
Panjang 24 (default) sudah cukup untuk sebagian besar aplikasi. Jika menghasilkan jutaan ID per hari, pertimbangkan meningkatkan ke 32. Minimum yang direkomendasikan adalah 16 karakter untuk mempertahankan resistansi tabrakan yang memadai.
Bisakah saya menggunakan CUID2 di browser?
Ya — library CUID2 berjalan di browser melalui Web Crypto API, dan di Node.js melalui modul crypto. Cocok untuk aplikasi sisi klien maupun server.