ULID Üretici
Sözlüksel olarak sıralanabilir benzersiz kimlikler oluşturur
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 |
|---|---|
| 01ARZ3NDEK | TSVE4RRFFQ69G5FAV |
| 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
Dört karakter kasıtlı olarak hariç tutulmuştur:
IveLhariç tutulur —1rakamıyla kolayca karıştırılırOhariç tutulur —0rakamıyla kolayca karıştırılırUhariç 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ır—01ARZ3NDEKTSV4RRFFQ69G5FAVve01arz3ndektsv4rrffq69g5favaynı 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:
| Özellik | ULID | UUID |
|---|---|---|
| Biçim | Crockford Base32 | Tireli onaltılık |
| Uzunluk | 26 karakter | 36 karakter |
| Zaman Damgası | 48 bitlik Unix ms | Yok (v4) veya 48 bit ms (v7) |
| Sıralanabilir | Evet — sözcüksel | Hayır (v4) / Evet (v7) |
| URL Güvenli | Evet (yalnızca alfasayısal) | Evet (tirelerle) |
| Bağımlılıklar | Kitaplık gerektirir | Yerel (crypto.randomUUID) |
| Veritabanı desteği | CHAR(26) veya BINARY(16) olarak depolayın | Yerel UUID sütun türü |
| Spesifikasyon | Topluluk 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:
| Özellik | ULID | NanoID |
|---|---|---|
| Zaman Damgası | Evet — 48 bitlik Unix ms | Hayır |
| Sıralanabilir | Evet | Hayır |
| Varsayılan uzunluk | 26 karakter | 21 karakter |
| Entropi | 80 bit (rastgele bileşen) | ~126 bit |
| Alfabe | Crockford Base32 (32 karakter) | URL güvenli Base64 (64 karakter) |
| Özelleştirilebilir uzunluk | Hayır | Evet (herhangi bir uzunluk) |
| Kullanım durumu | Zaman 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:
Kod Örnekleri
ULID oluşturma için ulid kitaplığı gereklidir (JavaScript, Python, Go, Rust ve daha fazlası için mevcuttur):
// 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)# 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-- 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;// 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)
}