Generator CUID

Generuje odporne na kolizje unikalne identyfikatory (CUID v1)

Liczba

Wygenerowane CUID

Kliknij Generuj, aby utworzyć CUID

CUID v1 to starszy format. Dla nowych projektów używaj CUID2.

Czym jest CUID?

CUID (Collision-Resistant Unique Identifier) to otwartoźródłowy algorytm generowania unikalnych identyfikatorów, które dobrze działają w systemach rozproszonych bez centralnego koordynatora. W przeciwieństwie do zwykłego UUID, CUID jest zaprojektowany do poziomego skalowania — wiele serwerów lub kart przeglądarki może niezależnie generować identyfikatory z minimalnym ryzykiem kolizji.

Każdy CUID zaczyna się od małej litery c, co sprawia, że format jest natychmiast rozpoznawalny. Pozostałe znaki to małe litery alfanumeryczne (base36), więc CUID jest bezpieczny dla adresów URL i może być używany bezpośrednio jako segment ścieżki URL lub klucz główny bazy danych bez dodatkowego kodowania.

Oryginalna specyfikacja CUID (v1) została stworzona przez Erica Elliotta i spopularyzowana przez pakiet npm cuid. Została zastąpiona przez CUID v2, który zapewnia bezpieczeństwo kryptograficzne. Ta strona — i generator powyżej — generuje identyfikatory CUID v1, klasyczny format wciąż szeroko stosowany w produkcyjnych bazach kodu.

Struktura CUID

CUID v1 ma około 25 znaków i składa się z pięciu połączonych segmentów, z których każdy zawiera inny rodzaj entropii:

Przykład: clrc4gkwz001ag2hs3k7f9m2q
cprefiksZawsze litera "c" — oznacza CUID
lrc4gkwzznacznik czasuZnacznik czasu w milisekundach w base36 (~8 znaków)
001alicznik4-znakowy licznik base36 — zapobiega kolizjom w tej samej milisekundzie
g2hsodcisk palca4-znakowy odcisk palca hosta base36 (info o przeglądarce/środowisku)
3k7f9m2qlosowy8-znakowy losowy blok base36 — dwie 32-bitowe wartości

Segmenty są po prostu połączone — nie ma separatorów. Całkowita długość nieznacznie się różni w zależności od bieżącej wartości znacznika czasu, ale pozostaje na poziomie około 25 znaków.

Jak CUID Zapobiega Kolizjom

Odporność na kolizje wynika z nakładania niezależnych źródeł entropii, tak że nawet w scenariuszach najgorszego przypadku (tysiące identyfikatorów generowanych na milisekundę na wielu maszynach) prawdopodobieństwo dwóch identycznych identyfikatorów pozostaje znikomo małe.

Znacznik Czasu w Milisekundach
Pierwszy segment koduje bieżący czas w base36. Identyfikatory generowane w różnych momentach automatycznie sortują się leksykograficznie według czasu tworzenia — przydatne do paginacji i debugowania.
Monotoniczny Licznik
W ramach tego samego procesu 4-znakowy licznik rośnie przy każdym wygenerowanym identyfikatorze. Nawet jeśli dwa wywołania nastąpią w tej samej milisekundzie na tej samej maszynie, licznik gwarantuje unikalność dla nawet 65 536 identyfikatorów na milisekundę.
Odcisk Palca Maszyny
Skrót wyprowadzony z danych specyficznych dla środowiska (ID procesu + nazwa hosta w Node.js; wymiary ekranu + informacje o navigator w przeglądarce). Pozwala to odróżnić identyfikatory generowane na oddzielnych hostach w dokładnie tej samej milisekundzie z tą samą wartością licznika.
Losowy Blok
Ostatnie 8 znaków pochodzi z dwóch niezależnych 32-bitowych wartości losowych zakodowanych w base36. Dodaje to ostatnią warstwę entropii chroniącą przed kolizjami, nawet jeśli odcisk palca dwóch maszyn okaże się taki sam.

CUID vs UUID v4

Zarówno CUID, jak i UUID v4 są szeroko stosowane do generowania identyfikatorów po stronie klienta. Podchodzą do tego samego problemu w różny sposób:

CechaCUID v1UUID v4
Formatc + base36 (~25 znaków)grupy hex (36 znaków z myślnikami)
SortowalnyMniej więcej (prefiks znacznika czasu)Nie
Bezpieczny dla URLTak (tylko alfanumeryczne)Głównie (myślniki są dopuszczalne w URL)
Odporność na kolizjeWysoka — znacznik czasu + licznik + odcisk palca + losowyWysoka — 122 bity losowości
PrzewidywalnośćCzęściowo (znacznik czasu widoczny)Brak (czysto losowy)
Długość~25 znaków36 znaków
Wymaga koordynacjiNieNie

UUID v4 jest bezpieczniejszym wyborem dla scenariuszy wrażliwych na bezpieczeństwo, ponieważ nie ujawnia informacji o czasie. CUID ma przewagę, gdy chcesz identyfikatory, które są mniej więcej sortowalne, krótsze i bez myślników — przydatne do użycia w adresach URL, nazwach plików lub logach, gdzie chcesz szybko zidentyfikować, kiedy rekord został utworzony.

CUID v1 vs CUID2

Specyfikacja CUID została znacznie zrewidowana. Zrozumienie różnic pomaga wybrać właściwą wersję dla projektu:

AspektCUID v1CUID v2
AlgorytmDeterministyczne komponentyOparty na SHA-3, w pełni nieprzejrzysty
KryptograficznyNieTak
Widoczny znacznik czasuTakNie
FormatZaczyna się od "c"Zaczyna się od "c" (konfigurowalne)
Pakiet npm@paralleldrive/cuid (przestarzały)@paralleldrive/cuid2
Długość~25 znaków24 znaki (domyślnie, konfigurowalne)

Dla nowych projektów CUID v2 jest zalecanym wyborem. Jego konstrukcja oparta na SHA-3 oznacza, że wyjście jest nieprzejrzyste — żaden znacznik czasu, licznik ani odcisk palca nie może być odtworzony z identyfikatora. Używaj CUID v1 tylko wtedy, gdy potrzebujesz wstecznej kompatybilności z istniejącym zestawem danych lub chcesz implementacji bez zależności.

Przypadki Użycia

Rozproszone Bazy Danych
Wiele fragmentów bazy danych lub mikroserwisów może niezależnie generować klucze główne bez tabeli sekwencji lub centralnej usługi ID, eliminując pojedynczy punkt awarii.
Generowanie Identyfikatorów po Stronie Klienta
Przeglądarka może przypisać CUID do nowego rekordu przed wysłaniem go do serwera, umożliwiając optymistyczne aktualizacje interfejsu i eliminując konieczność pobierania serwerowego ID.
Aplikacje Offline-First
Aplikacje mobilne lub PWA działające bez łączności mogą tworzyć rekordy ze stabilnymi identyfikatorami, które przeżyją synchronizację — bez konfliktów, gdy urządzenie wróci online.
Sligi URL
CUID zawierają tylko znaki alfanumeryczne, dzięki czemu można je bezpiecznie osadzać bezpośrednio w ścieżkach URL bez kodowania procentowego. Prefiks znacznika czasu dodaje przybliżone porządkowanie według czasu tworzenia.
Korelacja Zdarzeń / Logów
Ponieważ znacznik czasu jest zakodowany w pierwszym segmencie, wpisy logów oznaczone CUID można przybliżenie sortować według czasu tworzenia, nawet przez rozproszonych agregatorów logów.
ORM / Domyślny Prisma
Prisma używa CUID jako domyślnej strategii @id dla kluczy głównych String — @default(cuid()) — co czyni go jednym z najszerzej stosowanych formatów identyfikatorów w ekosystemie JavaScript.

Przykłady Kodu

Zainstaluj oficjalny pakiet CUID v2 (zalecany) lub napisz minimalną implementację v1 bez zależności:

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'

Jeśli wolisz implementację Node.js bez zależności algorytmu v1:

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'

Używanie CUID jako klucza głównego bazy danych z Prisma i PostgreSQL:

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())
}

Często Zadawane Pytania

Czy CUID jest bezpieczny dla URL?
Tak. CUID v1 używa tylko małych liter i cyfr (kodowanie base36), które są bezpiecznymi znakami URL. Kodowanie procentowe nie jest potrzebne przy użyciu CUID w ścieżce URL lub parametrze zapytania.
Czy CUID jest kryptograficznie bezpieczny?
Nie. CUID v1 używa Math.random() i ujawnia widoczny prefiks znacznika czasu. Nie nadaje się do celów wrażliwych na bezpieczeństwo, takich jak tokeny sesji lub linki do resetowania hasła. W takich przypadkach użyj crypto.randomUUID() lub CUID v2.
CUID vs NanoID — który wybrać?
NanoID jest kryptograficznie bezpieczny, krótszy (domyślnie 21 znaków) i używa konfigurowalnego alfabetu. Wybierz NanoID, gdy liczy się bezpieczeństwo lub gdy potrzebujesz krótszego identyfikatora. Wybierz CUID, gdy chcesz mniej więcej sortowalny identyfikator z prefiksem znacznika czasu, który jest czytelny dla człowieka.
Czy używać CUID v1 czy CUID v2?
CUID v2 jest aktualnym zaleceniem. Jest kryptograficznie bezpieczny, nie ujawnia informacji o czasie i jest aktywnie utrzymywany. CUID v1 jest przydatny, gdy potrzebujesz prostej implementacji bez zależności lub utrzymujesz starszy system. Ten generator produkuje identyfikatory CUID v1.
CUID vs ULID — jaka jest różnica?
Oba mają prefiks znacznika czasu i są leksykograficznie sortowalne. ULID używa Crockford base32 (128 bitów łącznie, 48-bitowy znacznik czasu + 80 bitów losowych), co czyni go nieco bardziej losowym. CUID dodaje odcisk palca maszyny i monotoniczny licznik, co poprawia odporność na kolizje na tym samym hoście w tej samej milisekundzie. ULID sortuje się bardziej niezawodnie, ponieważ znacznik czasu zajmuje pełną górną część.
Czy CUID gwarantuje unikalność?
Żaden schemat identyfikatorów nie może dać matematycznej gwarancji bez centralnego koordynatora. CUID sprawia, że kolizje są niezwykle mało prawdopodobne, łącząc cztery niezależne źródła entropii: znacznik czasu, licznik na proces, odcisk palca maszyny i dane losowe. W praktyce kolizje są znacznie mniej prawdopodobne niż awaria sprzętu.