ULID Üretici

Sözlüksel olarak sıralanabilir benzersiz kimlikler oluşturur

Adet

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

ULID Nedir?

ULID (Evrensel Olarak Benzersiz Sözcüksel Olarak Sıralanabilir Tanımlayıcı), hem benzersiz hem de doğal olarak sıralanabilir olacak şekilde tasarlanmış 128 bitlik bir tanımlayıcı biçimidir. Tamamen rastgele olan UUID v4'ün aksine ULID, yüksek bitlerinde milisaniye hassasiyetli Unix zaman damgası gömer.

ULID'ler Crockford'un Base32 alfabesi kullanılarak kodlanır ve URL güvenli, büyük/küçük harf duyarsız ve görsel olarak belirsiz karakterlerden arındırılmış kompakt 26 karakterlik bir dize üretir.

ULID spesifikasyonu Alizain Feerasta tarafından oluşturulmuş ve dağıtık sistemler, olay kaynak oluşturma ve veritabanı birincil anahtarlarında yaygın olarak kullanılmaktadır. ULID'ler IETF standardı değildir — ulid.github.io adresinde mevcut bir topluluk spesifikasyonudur.

ULID Yapısı

ULID 128 bit genişliğinde olup iki bileşene ayrılır:

Zaman DamgasıRastgele
01ARZ3NDEKTSVE4RRFFQ69G5FAV
48 bit — Milisaniye cinsinden Unix zaman damgası. 1 ms hassasiyetle oluşturma zamanını kodlar. 10889 yılına kadar tarihleri kapsar.80 bit — Kriptografik açıdan güvenli rastgele veri. Her ULID için yeniden oluşturulur (monotonluk modu kullanılmadıkça).

26 Crockford Base32 karakteri olarak kodlanır: ilk 10 karakter zaman damgasını, son 16 karakter rastgele bileşeni temsil eder.

Crockford Base32 Alfabesi

ULID'ler Crockford'un Base32 kodlamasını kullanır; 36 alfasayısal karakterden 32'sini kullanır. Alfabe: 0123456789ABCDEFGHJKMNPQRSTVWXYZ

Neden bu 32 karakter?
0123456789ABCDEFGHJKMNPQRSTVWXYZ

Dört karakter kasıtlı olarak hariç tutulmuştur:

  • I ve L hariç tutulur — 1 rakamıyla kolayca karıştırılır
  • O hariç tutulur — 0 rakamıyla kolayca karıştırılır
  • U hariç tutulur — oluşturulan ID'lerde yanlışlıkla müstehcen sözcüklerden kaçınır
  • Kodlama büyük/küçük harf duyarsızdır01ARZ3NDEKTSV4RRFFQ69G5FAV ve 01arz3ndektsv4rrffq69g5fav aynı ULID'dir

Crockford Base32, onaltılık sayıdan daha verimlidir (32 simge - 16'ya karşı) ve Base64'ten daha insan tarafından okunabilirdir.

ULID ile UUID Karşılaştırması

ULID'ler ve UUID'ler her ikisi de 128 bitlik tanımlayıcıları temsil eder, ancak kodlama ve tasarım hedefleri açısından önemli ölçüde farklıdır:

ÖzellikULIDUUID
BiçimCrockford Base32Tireli onaltılık
Uzunluk26 karakter36 karakter
Zaman Damgası48 bitlik Unix msYok (v4) veya 48 bit ms (v7)
SıralanabilirEvet — sözcükselHayır (v4) / Evet (v7)
URL GüvenliEvet (yalnızca alfasayısal)Evet (tirelerle)
BağımlılıklarKitaplık gerektirirYerel (crypto.randomUUID)
Veritabanı desteğiCHAR(26) veya BINARY(16) olarak depolayınYerel UUID sütun türü
SpesifikasyonTopluluk spesifikasyonu (ulid.github.io)RFC 4122 / RFC 9562

UUID ekosistemindeyseniz UUID v7 genellikle ULID'den daha iyi uygundur. Taze başlıyorsanız ve insan dostu kodlamayı tercih ediyorsanız ULID mükemmel bir seçimdir.

ULID ile nanoid Karşılaştırması

ULID ve nanoid her ikisi de kısa, URL güvenli tanımlayıcılar üretir, ancak farklı tasarım hedeflerine sahiptir:

ÖzellikULIDNanoID
Zaman DamgasıEvet — 48 bitlik Unix msHayır
SıralanabilirEvetHayır
Varsayılan uzunluk26 karakter21 karakter
Entropi80 bit (rastgele bileşen)~126 bit
AlfabeCrockford Base32 (32 karakter)URL güvenli Base64 (64 karakter)
Özelleştirilebilir uzunlukHayırEvet (herhangi bir uzunluk)
Kullanım durumuZaman sıralı ID'ler, veritabanı birincil anahtarlarıRastgele token'lar, kısa URL'ler, API anahtarları

Zaman sıralamasına ihtiyacınız varsa ULID'i seçin. Kısa, rastgele bir dizede maksimum entropi istiyorsanız nanoid'i seçin.

Veritabanlarında ULID Kullanımı

ULID'ler, gereksinimlerinize bağlı olarak veritabanlarında çeşitli şekillerde depolanabilir:

CHAR(26) Olarak Depolayın
En basit yaklaşım. Sözcüksel sıralama korunur. İkili depolamadan biraz daha büyük ama insan tarafından okunabilir.
BINARY(16) Olarak Depolayın
Kompakt depolama için ULID'yi 16 baytlık ikili gösterimine çözün. Sıralama korunur.
PostgreSQL
CHAR(26) olarak depolayın veya ikili depolama için bytea türünü kullanın. Yerel ULID türü yoktur.
MySQL / MariaDB
Verimli depolama için CHAR(26) CHARACTER SET ascii kullanın. BINARY(16)'da ikili depolama da çalışır.
SQLite
TEXT olarak depolayın. SQLite'ın varsayılan metin karşılaştırması ULID'leri doğru sıralar.
MongoDB
Dize alanı olarak depolayın. ULID'nin sözcüksel sıralanabilirliği MongoDB'nin dize karşılaştırmasıyla doğal çalışır.

Kod Örnekleri

ULID oluşturma için ulid kitaplığı gereklidir (JavaScript, Python, Go, Rust ve daha fazlası için mevcuttur):

JavaScript (ulid npm)
// Using the 'ulid' npm package
import { ulid } from 'ulid'

const id = ulid()          // "01ARZ3NDEKTSV4RRFFQ69G5FAV"
const id2 = ulid()         // "01ARZ3NDEKXXXXXXXXXXXX..." (same ms, incremented random)

// With a custom timestamp
const id3 = ulid(1469918176385) // deterministic time portion

// Extract the timestamp back out
import { decodeTime } from 'ulid'
decodeTime(id)  // → 1469918176385 (Unix ms)
Python (python-ulid)
# Using python-ulid
from ulid import ULID

uid = ULID()
str(uid)                    # "01ARZ3NDEKTSV4RRFFQ69G5FAV"
uid.timestamp               # 1469918176.385
uid.datetime                # datetime(2016, 7, 30, 23, 36, 16, 385000, tzinfo=timezone.utc)

# Parse an existing ULID string
parsed = ULID.from_str("01ARZ3NDEKTSV4RRFFQ69G5FAV")
parsed.timestamp            # 1469918176.385
PostgreSQL
-- Store ULIDs as TEXT or CHAR(26)
CREATE TABLE events (
  id   CHAR(26) PRIMARY KEY DEFAULT gen_ulid(),  -- if using a PG extension
  name TEXT NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

-- Or pass the ULID from your application layer
INSERT INTO events (id, name, created_at)
VALUES ('01ARZ3NDEKTSV4RRFFQ69G5FAV', 'user.signup', NOW());

-- Range queries are efficient because ULIDs sort chronologically
SELECT * FROM events
WHERE id > '01ARZ3NDEKTSV4RRFFQ69G5FAV'
ORDER BY id
LIMIT 20;
JavaScript (pure — no dependencies)
// Pure browser / Deno / Node.js implementation (no dependencies)
const CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'

function encodeTime(ms) {
  let result = '', n = BigInt(ms)
  for (let i = 9; i >= 0; i--) {
    result = CROCKFORD[Number(n & 31n)] + result
    n >>= 5n
  }
  return result
}

function encodeRandom(bytes) {
  let n = 0n
  for (const b of bytes) n = (n << 8n) | BigInt(b)
  let result = ''
  for (let i = 15; i >= 0; i--) {
    result = CROCKFORD[Number(n & 31n)] + result
    n >>= 5n
  }
  return result
}

function generateULID() {
  const randomBytes = new Uint8Array(10)
  crypto.getRandomValues(randomBytes)
  return encodeTime(Date.now()) + encodeRandom(randomBytes)
}

Sıkça Sorulan Sorular

ULID'ler küresel olarak benzersiz midir?
Evet — çok yüksek olasılıkla. 80 bitlik rastgele bileşen, milisaniye başına oluşturucu başına 2^80 ≈ 1,2 × 10^24 olası değer sağlar.
ULID, UUID ile aynı mı?
Hayır — ULID'ler ve UUID'ler, 128 bitlik bir değerin farklı kodlamalarıdır. UUID biçimini (tireli onaltılık) doğrulayan sistemlerde ULID doğrudan yerine geçemez.
ULID monoton modu nasıl çalışır?
Standart modda 80 bitlik rastgele bileşen her ULID için yeniden oluşturulur. Monoton modda, aynı milisaniye içinde birden fazla ULID oluşturulduğunda rastgele bileşen önceki değer artı birdir.
Oluşturma zaman damgasını almak için bir ULID'yi çözebilir miyim?
Evet. İlk 10 Crockford Base32 karakteri 48 bitlik Unix milisaniye zaman damgasını kodlar.
ULID resmi bir standart mı?
Hayır. ULID, ulid.github.io adresinde tutulan bir topluluk spesifikasyonudur. UUID v7 (RFC 9562, 2024), benzer zaman sıralama özelliklerine sahip IETF onaylı alternatiftir.