CUID Üretici

Çarpışmaya dayanıklı benzersiz kimlikler oluşturur (CUID v1)

Adet

Oluşturulan CUID'ler

CUID oluşturmak için Oluştur'a tıklayın

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:

Örnek: clrc4gkwz001ag2hs3k7f9m2q
cönekHer zaman "c" harfi — CUID olduğunu belirtir
lrc4gkwzzaman damgasıbase36 cinsinden milisaniye zaman damgası (~8 karakter)
001asayaç4 karakterlik base36 sayacı — aynı milisaniye çarpışmalarını önler
g2hsparmak izi4 karakterlik base36 ana bilgisayar parmak izi (tarayıcı/ortam bilgisi)
3k7f9m2qrastgele8 karakterlik base36 rastgele blok — iki 32 bitlik değer

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.

Milisaniye Zaman Damgası
İlk segment geçerli zamanı base36 ile kodlar. Farklı anlarda oluşturulan kimlikler, oluşturma zamanına göre otomatik olarak sözlükbilimsel sırayla sıralanır — sayfalama ve hata ayıklama için kullanışlıdır.
Monoton Sayaç
Aynı süreç içinde, 4 karakterlik sayaç oluşturulan her kimlikle birlikte artar. Aynı makinede aynı milisaniyede iki çağrı gerçekleşse bile, sayaç milisaniye başına 65.536 kimliğe kadar benzersizliği garanti eder.
Makine Parmak İzi
Ortama özgü verilerden türetilen bir karma (Node.js'de işlem kimliği + ana bilgisayar adı; tarayıcıda ekran boyutları + navigator bilgisi). Bu, aynı sayaç değeriyle tam olarak aynı milisaniyede ayrı ana bilgisayarlarda oluşturulan kimlikleri ayırt eder.
Rastgele Blok
Son 8 karakter, base36 ile kodlanmış iki bağımsız 32 bitlik rastgele değerden gelir. Bu, iki makinenin parmak izinin aynı değere karma yapması durumunda bile çarpışmalara karşı koruma sağlayan son bir entropi katmanı ekler.

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:

ÖzellikCUID v1UUID v4
Formatc + base36 (~25 karakter)hex grupları (tire ile 36 karakter)
SıralanabilirYaklaşık (zaman damgası öneki)Hayır
URL güvenliEvet (yalnızca alfasayısal)Çoğunlukla (tireler URL'lerde geçerlidir)
Çarpışma direnciYüksek — zaman damgası + sayaç + parmak izi + rastgeleYüksek — 122 bit rastgele
Tahmin edilebilirlikKısmen (zaman damgası görünür)Yok (tamamen rastgele)
Uzunluk~25 karakter36 karakter
Koordinasyon gerektirirHayırHayı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:

KonuCUID v1CUID v2
AlgoritmaDeterministik bileşenlerSHA-3 tabanlı, tamamen opak
KriptografikHayırEvet
Zaman damgası görünürEvetHayı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 karakter24 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ı

Dağıtılmış Veritabanları
Birden fazla veritabanı parçası veya mikro hizmet, bir sıra tablosu veya merkezi kimlik hizmeti olmadan bağımsız olarak birincil anahtarlar oluşturabilir ve böylece tek bir arıza noktası ortadan kalkar.
İstemci Tarafı Kimlik Oluşturma
Bir tarayıcı, sunucuya göndermeden önce yeni bir kayda CUID atayabilir, iyimser UI güncellemelerini etkinleştirebilir ve sunucu tarafından atanan bir kimlik almak için gereken gidiş-dönüşü ortadan kaldırabilir.
Çevrimdışı İlk Uygulamalar
Bağlantısız çalışan mobil veya PWA uygulamaları, senkronizasyondan sağ çıkan kararlı kimliklere sahip kayıtlar oluşturabilir — cihaz tekrar çevrimiçi olduğunda çakışma olmaz.
URL Kısa Yolları
CUID'ler yalnızca alfasayısal karakterler içerdiğinden, yüzde kodlama olmadan doğrudan URL yollarına güvenle gömülebilirler. Zaman damgası öneki, kabaca oluşturulma zamanı sıralaması ekler.
Olay / Günlük İlişkilendirme
Zaman damgası ilk segmentte kodlandığından, CUID ile etiketlenmiş günlük girişleri, dağıtılmış günlük toplayıcılarda bile oluşturulma zamanına göre kabaca sıralanabilir.
ORM / Prisma Varsayılanı
Prisma, String birincil anahtarları için varsayılan @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:

JavaScript / TypeScript
// 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:

Node.js (no dependencies)
// 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:

Prisma / SQL
-- 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())
}

Sıkça Sorulan Sorular

CUID URL güvenli midir?
Evet. CUID v1 yalnızca küçük harf ve rakamlar (base36 kodlaması) kullanır; bunların tamamı URL güvenli karakterlerdir. URL yolunda veya sorgu parametresinde CUID kullanırken yüzde kodlaması gerekmez.
CUID kriptografik olarak güvenli midir?
Hayır. CUID v1, Math.random() kullanır ve görünür bir zaman damgası öneki açığa çıkarır. Oturum belirteçleri veya parola sıfırlama bağlantıları gibi güvenliğe duyarlı amaçlar için uygun değildir. Bu kullanım durumları için crypto.randomUUID() veya CUID v2 kullanın.
CUID vs NanoID — hangisini seçmeliyim?
NanoID kriptografik olarak güvenlidir, daha kısadır (varsayılan 21 karakter) ve özelleştirilebilir bir alfabe kullanır. Güvenlik önemli olduğunda veya daha kısa bir kimliğe ihtiyacınız olduğunda NanoID'yi seçin. Kabaca sıralanabilir, zaman damgası önekli ve insan tarafından hata ayıklanabilir bir kimlik istediğinizde CUID'yi seçin.
CUID v1 mi CUID v2 mi kullanmalıyım?
CUID v2 mevcut öneridir. Kriptografik olarak güvenlidir, zamanlama bilgisi sızdırmaz ve aktif olarak bakımı yapılmaktadır. CUID v1, bağımlılıksız basit bir uygulamaya ihtiyacınız olduğunda veya eski bir sistemi bakımını yaptığınızda kullanışlıdır. Bu oluşturucu CUID v1 kimlikleri üretir.
CUID vs ULID — fark nedir?
Her ikisi de zaman damgası öneklidir ve sözlükbilimsel olarak sıralanabilir. ULID, Crockford base32 kullanır (toplam 128 bit, 48 bitlik zaman damgası + 80 bit rastgele) ve biraz daha rastgele hale getirir. CUID, aynı milisaniyede aynı ana bilgisayarda çarpışma direncini artıran bir makine parmak izi ve monoton sayaç ekler. ULID, zaman damgası tam üst sıralı kısmı kapladığından daha güvenilir biçimde sıralanır.
CUID benzersizliği garanti eder mi?
Hiçbir kimlik şeması merkezi koordinatör olmadan matematiksel garanti veremez. CUID, dört bağımsız entropi kaynağını birleştirerek çarpışmaları son derece olası kılmaz: zaman damgası, işlem başına sayaç, makine parmak izi ve rastgele veriler. Uygulamada çarpışmalar, donanım arızasından çok daha az olasıdır.