CUID Üretici
Çarpışmaya dayanıklı benzersiz kimlikler oluşturur (CUID v1)
Oluşturulan CUID'ler
CUID v1 eski bir formattır. Yeni projeler için CUID2 kullanın.
CUID Nedir?
CUID (Çarpışmaya Dayanıklı Benzersiz Tanımlayıcı), merkezi bir koordinatör olmadan dağıtılmış sistemlerde iyi çalışan benzersiz kimlikler oluşturmak için açık kaynaklı bir algoritmadır. Basit bir UUID'nin aksine, CUID yatay olarak ölçeklenebilir olacak şekilde tasarlanmıştır — birden fazla sunucu veya tarayıcı sekmesi minimum çarpışma riskiyle bağımsız olarak kimlikler oluşturabilir.
Her CUID küçük harf c ile başlar ve format bakışta hemen tanınabilir. Kalan karakterlerin tamamı küçük harf alfasayısal (base36) olduğundan, CUID URL güvenlidir ve ek kodlama olmadan doğrudan URL yol segmenti veya veritabanı birincil anahtarı olarak kullanılabilir.
Orijinal CUID spesifikasyonu (v1), Eric Elliott tarafından oluşturulmuş ve npm paketi cuid aracılığıyla yaygınlaşmıştır. Artık kriptografik güvenlik sağlayan CUID v2 tarafından yerini almıştır. Bu sayfa ve yukarıdaki oluşturucu, üretim kod tabanlarında hâlâ yaygın olarak karşılaşılan klasik format olan CUID v1 kimlikleri üretir.
CUID Yapısı
Bir CUID v1 yaklaşık 25 karakter uzunluğundadır ve her biri farklı türde entropi taşıyan beş birleştirilmiş segmentten oluşur:
Segmentler basitçe birleştirilir — ayırıcı yoktur. Toplam uzunluk mevcut zaman damgası değerine bağlı olarak biraz farklılık gösterir ancak yaklaşık 25 karakterde kalır.
CUID Çarpışmaları Nasıl Önler
Çarpışma direnci, bağımsız entropi kaynaklarını katmanlayarak elde edilir; böylece en kötü senaryolarda bile (birçok makine genelinde milisaniye başına binlerce kimlik oluşturulması) iki özdeş kimlik olasılığı son derece düşük kalır.
CUID vs UUID v4
Hem CUID hem de UUID v4, istemci tarafı kimlik oluşturmak için yaygın olarak kullanılır. Aynı soruna farklı yaklaşımlar benimserler:
| Özellik | CUID v1 | UUID v4 |
|---|---|---|
| Format | c + base36 (~25 karakter) | hex grupları (tire ile 36 karakter) |
| Sıralanabilir | Yaklaşık (zaman damgası öneki) | Hayır |
| URL güvenli | Evet (yalnızca alfasayısal) | Çoğunlukla (tireler URL'lerde geçerlidir) |
| Çarpışma direnci | Yüksek — zaman damgası + sayaç + parmak izi + rastgele | Yüksek — 122 bit rastgele |
| Tahmin edilebilirlik | Kısmen (zaman damgası görünür) | Yok (tamamen rastgele) |
| Uzunluk | ~25 karakter | 36 karakter |
| Koordinasyon gerektirir | Hayır | Hayır |
UUID v4, zamanlama bilgisi açıklamadığından güvenliğe duyarlı senaryolar için daha güvenli bir seçimdir. CUID, kabaca sıralanabilir, daha kısa ve tire içermeyen kimliklere ihtiyaç duyulduğunda avantajlıdır — bir kaydın ne zaman oluşturulduğunu hızlıca belirlemek istediğiniz URL'ler, dosya adları veya günlüklerde kullanışlıdır.
CUID v1 vs CUID2
CUID spesifikasyonu önemli ölçüde revize edilmiştir. Farklılıkları anlamak, projeniz için doğru sürümü seçmenize yardımcı olur:
| Konu | CUID v1 | CUID v2 |
|---|---|---|
| Algoritma | Deterministik bileşenler | SHA-3 tabanlı, tamamen opak |
| Kriptografik | Hayır | Evet |
| Zaman damgası görünür | Evet | Hayır |
| Format | "c" ile başlar | "c" ile başlar (yapılandırılabilir) |
| npm paketi | @paralleldrive/cuid (kullanım dışı) | @paralleldrive/cuid2 |
| Uzunluk | ~25 karakter | 24 karakter (varsayılan, yapılandırılabilir) |
Yeni projeler için CUID v2 önerilen seçimdir. SHA-3 tabanlı yapısı, çıktının opak olduğu anlamına gelir — kimlikten zaman damgası, sayaç veya parmak izi geri mühendislikle çıkarılamaz. Yalnızca mevcut bir veri kümesiyle geriye dönük uyumluluk gerektiğinde veya bağımlılıksız bir uygulama istediğinizde CUID v1 kullanın.
Kullanım Durumları
@id stratejisi olarak CUID kullanır — @default(cuid()) — bu da onu JavaScript ekosisteminde en yaygın kullanılan kimlik formatlarından biri yapar.Kod Örnekleri
Resmi CUID v2 paketini (önerilen) kurun veya bağımlılıksız minimal bir v1 uygulaması yazın:
// 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'v1 algoritmasının bağımlılıksız Node.js uygulamasını tercih ederseniz:
// 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'Prisma ve PostgreSQL ile CUID'yi veritabanı birincil anahtarı olarak kullanmak:
-- 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())
}