
TLDR: UUID’ler, benzersiz kimlikler oluşturmak için kullanılan 128 bitlik değerlerdir. Merakı olmayan v4 kullanıp geçebilir.
UUID Nedir?
UUID (Universally Unique Identifier), benzersiz kimlikler oluşturmak için kullanılan 128 bitlik değerlerdir. Bu değerler, genellikle rastgele oluşturulur ve çakışma olasılığı oldukça düşüktür. UUID’ler, genellikle 32 haneli 5 grup şeklinde gösterilir.
Örneğin: cff46ea8-eb27-4c96-ad76-c2a21da6095d
.
Fun Fact: Tarayıcı konsoluna
crypto.randomUUID()
yazarak rastgele UUIDv4 oluşturabilirsiniz.
UUID Versiyonları
Versiyonlar arasındaki farklar, UUID’nin nasıl oluşturulduğuna ve hangi algoritmanın kullanıldığına bağlıdır. Bir UUID’nin versiyonunu öğrenmek için 3. kısımdaki ilk hanesine bakabilirsiniz. Örneğin, cff46ea8-eb27-4c96-ad76-c2a21da6095d
UUID’sinin versiyonu 4’tür.
v1
- Zaman ve MAC adresi kullanılarak oluşturulur. MAC adresi sabit olduğundan, aynı makinede oluşturulan UUID’ler birbirine çok benzer olabilir.
v2
- Güvenlik kimlikleri için ayrılmış, ancak detayları pek bilinmiyor.
v3
- Sağlanan verilerin MD5 hash’leri kullanılarak oluşturulur. Genellikle DNS ve URL’ler hash için kullanılır.
v4
- Tamamen rastgele oluşturulur. Genellikle en çok kullanılan versiyondur. UUID’lerin çakışma olasılığı oldukça düşüktür.
v5
- Sağlanan verilerin SHA-1 hash’leri kullanılarak oluşturulur. v3 ile benzer şekilde, DNS veya URL gibi veriler kullanılır.
v6
- v1’le aynı verileri kullanmakla beraber v1’den farklı olarak, sıralamayı kolaylaştırmak için bu bileşenlerin sırası değiştirilmiştir.
v7
- Zaman damgası ve rastgele verilerle oluşturulur. Oluşturma zamanına göre sıralama imkanı sunar. (Veritabanında sıralama yaparken kullanışlı olabilir.)
v8
- Tamamen özelleştirilebilir bir versiyondur; yalnızca versiyon ve varyant alanlarını belirli kurallara göre içerir, geri kalanı kullanıcıya bırakılmıştır.
Nil UUID
- Tüm bitleri 0 olan UUID’dir. Genellikle boş bir UUID olarak kullanılır
00000000-0000-0000-0000-000000000000
Max UUID
- Tüm bitleri 1 olan UUID’dir. Genellikle en büyük UUID olarak kullanılır.
ffffffff-ffff-ffff-ffff-ffffffffffff
UUID Varyantları
Varyantlar, UUID’nin nasıl oluşturulduğunu belirler. Az önceki görsellerde gördüğümüz varyant bu. UUID’lerin 4 varyantı vardır:
- Varyant 0-7: UUID, 1980’lerden kalma eski bilgisayar sistemleriyle geriye dönük uyumlu.
- Varyant 8-b: UUID, “RFC 4122” standardına ait. Günümüzde en yaygın kullanılan UUID türüdür.
- Varyant c ve d: UUID, eski Windows sistemleriyle uyumlu.
- Varyant e ve f: Gelecekteki UUID versiyonları için ayrılmış.
Alternatifler
ULID (Universally Unique Lexicographically Sortable Identifier)
- UUID’ye benzer bir yapıya sahiptir. 48 bitlik bir zaman damgası ve 80 bitlik rastgele veri içerir. 128 bit ile UUID’yle aynı uzunluktadır ve 26 karakterlik bir Base32 kodlaması kullanır bu yüzden de UUID’ye göre daha kısadır. Aynı zamanda, sıralanabilir olması avantajlarından biridir.
Örneğin:01E2XZ6VXH3Z2ZJ9XKJZQYHJ7Z
KSUID (K-Sortable Unique Identifier)
- İlk 32 bitlik kısmı zaman damgasıdır ve oluşturuldukları zamana göre sıralanabilirler. Geri kalan kısmı rastgele bir sayıdan oluşur. 160 bit uzunluğundadır ve 20 karakterlik bir Base62 kodlaması kullanır. GitHub Repo
Örneğin:2o2PVhy4DF1bTH2b9hA0CwPkzWk
TSID (Time Sortable ID)
- TSID, kısa ve okunabilir bir şekilde tasarlanmıştır. Zaman bazlı sıralama yeteneğine sahiptir. 64 bitlik bir sayıdır ve 13 karakterlik bir Base32 kodlaması kullanır.
Örneğin:0DXBQ9H279R05
Snowflake ID
-
Twitter tarafından geliştirilen Snowflake, 64 bitlik sayılardır (63 bitlik işaretli tam sayı olarak kullanılır).
- İlk 41 bit, milisaniye cinsinden bir zaman damgasını içerir.
- Sonraki 10 bit, çakışmayı önlemek için makine kimliği olarak kullanılır.
- 12 bit, aynı milisaniye içinde birden fazla ID üretmek için sıralı bir sayaç görevi görür.
UUID’ye göre daha kısa ve sıralanabilir olması avantajlarından bazılarıdır. Aynı zamanda, Discord tarafından da kullanılmaktadır. Örnek ve dönüştürücü için buraya bakabilirsiniz.
MongoID (MongoDB ObjectID)
-
MongoDB ObjectID veya kısaca MongoID, MongoDB veritabanında kullanılan varsayılan kimlik türüdür. Her biri 8-bit olan 12 byte’tan(96 bit) oluşur ve genellikle 24 karakterlik bir hexadecimal dize olarak temsil edilir.
Örneğin:651d56b4f437a342a4f0e692
- İlk 4 byte: ObjectID’nin oluşturulma zamanını gösteren bir zaman damgasıdır. Unix epoch’tan bu yana geçen saniyeleri ifade eder. Bu sayede ObjectID’ler, oluşturuldukları zamana göre sıralanabilir.
- Sonraki 5 byte: Her işlem için bir kez oluşturulan rastgele bir değerdir. Bu değer, makine ve işlem bazında benzersizdir, böylece farklı makinelerde ve süreçlerde aynı ObjectID’nin üretilmesi engellenir.
- Son 3 byte: Rastgele bir başlangıç değeriyle başlatılan ve artan bir sayaçtır. Aynı saniye içinde birden fazla ObjectID’nin benzersiz olmasını sağlar.
Nano ID
- NanoID, JavaScript için geliştirilen, küçük(UUID’ye göre oldukça büyük), güvenli, URL dostu ve benzersiz string ID’ler üreten bir ID oluşturucudur. Performans odaklı ve minimal bir yapıya sahiptir. GitHub Repo
Örneğin:1StGXR8_Z5jdHi6B-myT
Cuid2
- Cuid2, güvenli ve çakışma olasılığı düşük, yeni nesil benzersiz ID’ler oluşturan bir sistemdir. Yatay ölçeklenebilirlik ve performans için optimize edilmiştir ve UUID/GUID gibi geleneksel yöntemlere göre çeşitli avantajlar sunar. Sıralama yapılacak işler için önerilmiyor. GitHub Repo
Örneğin:tz4a98xxat96iws9zmbrgj3a
Özetle
Sıralama ile işimiz yoksa ve rastgele bir kimlik oluşturmak istiyorsak, UUIDv4 kullanmaya devam edebiliriz. Ancak, sıralama yapmamız gerekebilecek durumlarda UUIDv7 veya Snowflake gibi farklı bir çözüme yönelebiliriz. Kendimce yaptığım araştırmalar sonucu yazdığım bir yazıdır eksik veya hatalı bilgi içerebilir. Daha detaylı bilgi için kaynaklara bakabilirsiniz.
Teşekkürler ve Kaynaklar
Kafamı dağıtmak için biraz da merak ettiğimden araştırmak istemiştim. Öylesine attığım tweette bilgilerini benimle paylaşıp yazıya ışık tutan @eserozvataf ve @9ssi7 kişilerine teşekkürü bir borç bilirim 🙏. Yayınlanmasının ardından geribildirimleriyle yazının gelişmesinde katkıda bulunan @baskindev ve @Keleesssss kişilerine de ayrıca teşekkürler 🙏.