ULID Oluşturma Aracı: Yapısı, Kullanımı ve Teknik Özellikleri
Bu sayfa, ULID (Universally Unique Lexicographically Sortable Identifier) formatında benzersiz tanımlayıcılar üretir. Kullanıcı, ihtiyaç duyduğu ID sayısını (1 ile 100 arasında) seçer ve araç, her biri 26 karakter uzunluğunda, büyük/küçük harf duyarsız bir liste oluşturur. Oluşturulan her ULID, tek tıkla panoya kopyalanabilir veya tüm liste "Tümünü Kopyala" işleviyle alınabilir. Üretim işlemi tamamen tarayıcı içinde, crypto.getRandomValues() API'si kullanılarak gerçekleşir; hiçbir veri sunucuya gönderilmez.
ULID’i Diğer Formatlardan Ayıran Özellikler
UUID formatıyla karşılaştırıldığında ULID, 36 karakter yerine 26 karakterle daha kısa bir temsil sunar. Bunun nedeni, Crockford’un base32 alfabesini kullanmasıdır. Bu alfabe, 0-9 rakamları ile I, L, O, U harfleri dışındaki A-Z harflerini içerir. I, L, O, U harflerinin çıkarılma nedeni, 1, 0 ve diğer harflerle görsel karışıklığı önlemektir. Sonuç olarak ULID’ler büyük/küçük harf duyarsızdır ve tire içermez. URL’lerde yüzde kodlaması gerektirmez; tüm karakterleri RFC 3986 standardında ayrılmamış (unreserved) karakterlerdir.
ULID’in en önemli farkı, ilk 10 karakterin milisaniye hassasiyetinde bir zaman damgası kodlamasıdır. Bu sayede ULID’ler, oluşturulma zamanına göre sözlükbilimsel (lexicographic) olarak sıralanabilir. Aynı anda üretilen birden fazla ULID arasında zaman damgası aynı olacağı için kesin bir sıralama garantisi yoktur; sıralama yalnızca farklı milisaniyelerde üretilen ID’ler için geçerlidir.
Bu sayfada ULID için büyük harf veya tire geçiş anahtarı bulunmaz. Çünkü format zaten bu özellikleri varsayılan olarak sunar. Kullanıcının herhangi bir ek ayar yapması gerekmez.
ULID’in İç Yapısı: 128 Bitin Dağılımı
Bir ULID, toplam 128 bit (16 bayt) uzunluğundadır. Bu bitler iki ana bölüme ayrılır:
-
Zaman damgası (48 bit): İlk 10 karakter, milisaniye cinsinden Unix zamanını kodlar. 48 bit ile yaklaşık 8.925 yıl boyunca benzersiz zaman değerleri ifade edilebilir. Bu, ULID’lerin 10889 yılına kadar sorunsuz çalışabileceği anlamına gelir.
-
Rastgele bileşen (80 bit): Kalan 16 karakter, 80 bitlik rastgele bir değer taşır. Bu rastgelelik, aynı milisaniye içinde üretilen ULID’lerin çakışma olasılığını en aza indirir.
Zaman damgası ve rastgele bileşen, Crockford base32 ile kodlanır. Base32, her 5 biti bir karaktere dönüştürür. 128 bit / 5 bit = 25,6 karakter. Ondalık kısım atıldığında 25 karakter yeterli olmaz; bu nedenle 130 bit kullanılır (10 karakter × 5 bit = 50 bit zaman, 16 karakter × 5 bit = 80 bit rastgele, toplam 130 bit). Fazladan 2 bit, zaman damgası bölümüne eklenir. Pratikte bu, zaman damgasının 48 bit değil 50 bit olarak kodlandığı anlamına gelir. Ancak gerçek hassasiyet yine milisaniyedir; fazla bitler gelecekteki zaman aralığını genişletmek için kullanılır.
Karşılaştırma: ULID, UUID v4 ve UUID v7
| Özellik | ULID | UUID v4 | UUID v7 |
|---|---|---|---|
| Karakter uzunluğu | 26 | 36 | 36 |
| Tire sayısı | 0 | 4 | 4 |
| Büyük/küçük harf duyarlılığı | Duyarsız | Duyarlı (çoğunlukla küçük) | Duyarlı (çoğunlukla küçük) |
| Zaman damgası | 48 bit (milisaniye) | Yok | 48 bit (milisaniye) |
| Rastgele bit | 80 bit | 122 bit | 74 bit |
| Sıralanabilirlik | Evet (sözlükbilimsel) | Hayır | Evet (zaman bazlı) |
| URL güvenliği | Evet (kodlama gerekmez) | Hayır (tire ve büyük harf sorunu) | Hayır (tire ve büyük harf sorunu) |
UUID v7, ULID’e benzer bir zaman damgası yapısı sunar ancak daha uzun karakter temsili ve tireler nedeniyle URL’lerde kullanımı daha zordur. ULID, 26 karakterle hem daha kısa hem de doğrudan URL’lerde kullanılabilir.
Çarpışma Olasılığı ve İstatistiksel Güvenlik
ULID’in 80 bitlik rastgele bileşeni, aynı milisaniye içinde üretilen ID’ler arasında çakışma olasılığını belirler. 80 bit, yaklaşık 1,2 × 10^24 olası değer demektir. Bir milisaniyede 1.000 ULID üretilse bile, çarpışma olasılığı ihmal edilebilir düzeydedir (yaklaşık 2^-80). Pratikte, aynı milisaniyede 100’den fazla ID üretmek bu aracın sınırlarını aşar; çünkü maksimum 100 ID üretilebilir. Bu nedenle çarpışma riski yok denecek kadar azdır.
Ancak ULID’lerin tamamen rastgele olmadığı unutulmamalıdır. Zaman damgası kısmı tahmin edilebilirdir. Rastgele bileşen kriptografik olarak güçlü olduğu için ID’lerin tahmin edilmesi zordur, ancak tamamen rastgele UUID v4’e göre daha düşük entropiye sahiptir (80 bit vs 122 bit). Güvenlik açısından kritik uygulamalarda (örneğin erişim tokenları) ULID yerine UUID v4 tercih edilmelidir.
Veritabanı İndeksleme Performansına Etkisi
Veritabanlarında birincil anahtar olarak rastgele UUID kullanmak, B-ağacı indekslerinde sayfa bölünmelerine (page split) ve düzensiz ekleme performansına yol açar. ULID’ler zaman damgası içerdiğinden, sırayla eklenen kayıtlar yaklaşık olarak artan bir düzende indekse yazılır. Bu, yeni verilerin mevcut indeksteki son sayfalara eklenmesini sağlar ve sayfa bölünme sayısını azaltır.
Örneğin, bir PostgreSQL tablosunda PRIMARY KEY olarak UUID v4 kullanmak, ortalama %30-40 daha fazla indeks sayfası yazımına neden olabilir. ULID veya UUID v7 gibi zaman sıralı identifikatörler, bu yükü azaltır. Ancak ULID’in 26 karakterlik metin temsili, 16 baytlık ikili UUID’den daha fazla depolama alanı kaplar (26 bayt UTF-8). Veritabanında uuid türü yerine metin sütunu kullanıldığında bu fark önemli hale gelir. Yine de çoğu uygulama için bu ek alan kabul edilebilir düzeydedir.
Gizlilik ve Yerel Üretim
Bu araç, tüm ULID’leri tarayıcıda, crypto.getRandomValues() API’si aracılığıyla üretir. Bu API, işletim sistemi düzeyinde kriptografik olarak güçlü rastgele sayı üreteçlerini kullanır. Üretim sırasında hiçbir veri ağ üzerinden gönderilmez; sunucu tarafı işlem yoktur. Bu, hassas verilerin (örneğin kullanıcı kimlikleri, oturum anahtarları) yalnızca yerel makinede kalmasını sağlar.
Gizlilik bilincine sahip geliştiriciler için bu önemli bir avantajdır. Çevrimiçi ID üreteçlerinin bir kısmı, üretilen ID’leri sunucuda günlüğe kaydedebilir veya üçüncü taraflarla paylaşabilir. Bu araçta böyle bir risk yoktur.
Sıkça Sorulan Sorular
S: ULID’ler ne kadar süre boyunca benzersiz kalır?
C: Zaman damgası 48 bit olduğu için yaklaşık 8.925 yıl sonra taşma meydana gelir. Bu süre sonunda aynı zaman damgası değerleri tekrarlanabilir. Ancak pratikte bu süre, herhangi bir uygulamanın ömrünün çok ötesindedir.
S: Aynı milisaniyede üretilen ULID’lerin sıralaması güvenilir mi?
C: Hayır. Aynı milisaniyede üretilen ULID’lerin zaman damgası aynıdır; sıralama yalnızca rastgele bileşene göre yapılır. Bu nedenle kesin bir kronolojik sıra beklenmemelidir. Farklı milisaniyelerde üretilenler ise zaman damgasına göre doğru sıralanır.
S: ULID’ler neden büyük/küçük harf duyarsızdır?
C: Crockford base32 alfabesi, görsel olarak karışabilecek karakterleri (I/1, L/1, O/0, U/V) kaldırdığı için büyük ve küçük harfler aynı değere karşılık gelir. Bu sayede kullanıcılar ID’leri yazarken harf büyüklüğü konusunda endişelenmez.
S: 100’den fazla ULID üretebilir miyim?
C: Bu araçta üst sınır 100’dür. Daha fazla sayıda ID’ye ihtiyacınız varsa, birden çok kez üretim yapabilir veya doğrudan bir kitaplık kullanarak kendi kodunuzda sınırsız sayıda ULID oluşturabilirsiniz.
S: ULID ile UUID arasında performans farkı var mı?
C: Veritabanı indeksleme açısından ULID, rastgele UUID’den daha iyi performans gösterir. Ancak 26 karakterlik metin depolaması, 16 baytlık ikili UUID’den daha fazla alan kaplar. Uygulamanızın gereksinimlerine göre seçim yapılmalıdır.
S: ULID’ler kriptografik olarak güvenli midir?
C: Rastgele bileşen kriptografik olarak güçlü olsa da, toplam entropi UUID v4’e göre düşüktür (80 bit vs 122 bit). Ayrıca zaman damgası tahmin edilebilir olduğu için, ULID’ler gizli anahtar veya oturum kimliği olarak kullanılmamalıdır. Bu tür amaçlar için UUID v4 veya daha yüksek entropili formatlar tercih edilmelidir.