CUID Generator
Menghasilkan ID unik yang tahan terhadap tabrakan (CUID v1)
CUID yang Dibuat
CUID v1 adalah format lama. Untuk proyek baru, gunakan CUID2.
Apa itu CUID?
CUID (Collision-resistant Unique IDentifier) adalah ID unik global yang dirancang untuk aplikasi horizontal scalable.
Selalu dimulai dengan huruf c, diikuti timestamp, counter, fingerprint host, dan segmen acak — semuanya dienkodekan dalam base36.
ID bersifat URL-safe, ringkas, dan mudah dibaca, sehingga cocok untuk ID database, URL, dan pembuatan sesi.
Struktur CUID
Setiap CUID terdiri dari lima bagian yang berbeda untuk memastikan keunikan di seluruh mesin, proses, dan waktu:
Desain hierarki ini memastikan ID terurut secara kronologis sambil mempertahankan keacakan yang cukup untuk sistem terdistribusi.
Resistansi Tabrakan
CUID menggabungkan beberapa mekanisme untuk menjamin keunikan:
CUID vs UUID
Baik CUID maupun UUID memecahkan masalah keunikan tetapi dengan pendekatan yang berbeda:
| Fitur | CUID v1 | UUID v4 |
|---|---|---|
| Format | Alfanumerik huruf kecil | Hex dengan tanda hubung |
| Sortable | Sebagian (timestamp pertama) | Tidak (v4 acak) |
| URL-safe | Ya | Ya (dengan tanda hubung) |
| Resistansi Tabrakan | Tinggi (struktural) | Tinggi (statistik) |
| Prediktabilitas | Rendah (timestamp terlihat) | Sangat rendah |
| Panjang | 25 karakter | 36 karakter |
| Memerlukan koordinasi | Tidak | Tidak |
CUID lebih baik untuk ID database yang terlihat dan URL; UUID lebih umum digunakan dan memiliki dukungan lebih luas.
CUID v1 vs CUID v2
CUID v2 adalah penulisan ulang algoritma lengkap yang mengatasi masalah keamanan di CUID v1:
| Aspek | CUID v1 | CUID v2 |
|---|---|---|
| Algoritma | Kustom | SHA3 + CSPRNG |
| Kriptografi | Tidak (prediktabel) | Ya (aman secara kriptografi) |
| Timestamp | Terlihat jelas | Tersembunyi dalam hash |
| Format | Selalu dimulai dengan 'c' | Prefix yang dapat dikustomisasi |
| Package npm | cuid | @paralleldrive/cuid2 |
| Panjang | 25 karakter tetap | Dapat dikustomisasi (default 24) |
Untuk proyek baru, CUID v2 direkomendasikan karena memberikan jaminan keamanan yang lebih kuat sambil mempertahankan kemudahan penggunaan.
Kasus Penggunaan Umum
tabrakan yang minimal.Contoh Kode
Instalasi dan penggunaan dasar:
// npm install @paralleldrive/cuid2 (recommended — CUID v2)
import { createId } from '@paralleldrive/cuid2'
const id = createId()
// → 'tz4a98xxat96iws9zmbrgj3a'
// Custom length
import { init } from '@paralleldrive/cuid2'
const createShortId = init({ length: 10 })
createShortId() // → 'zxp1l6mf4c'Integrasi Node.js dan database umum:
// Pure Node.js — CUID v1 style (no dependencies)
let counter = 0
function pad(str, size) {
return str.padStart(size, '0').slice(-size)
}
function fingerprint() {
const os = require('os')
const source = [process.pid, os.hostname().length].join('')
let hash = 0
for (const c of source) {
hash = ((hash << 5) - hash) + c.charCodeAt(0)
hash |= 0
}
return pad(Math.abs(hash).toString(36), 4)
}
function cuid() {
const timestamp = Date.now().toString(36)
const cnt = pad((counter++ & 0xffff).toString(36), 4)
const fp = fingerprint()
const rnd = pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
+ pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
return 'c' + timestamp + cnt + fp + rnd
}
console.log(cuid()) // → 'clrc4gkwz001ag2hs3k7f9m2q'Penggunaan constraint database:
-- Use CUID as a primary key in PostgreSQL
CREATE TABLE users (
id TEXT PRIMARY KEY DEFAULT gen_cuid(),
name TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT now()
);
-- Prisma schema (auto-generates CUID by default)
model User {
id String @id @default(cuid())
name String
createdAt DateTime @default(now())
}