UUID v7’nin Yapısı ve Çalışma Prensibi
UUID v7, 128 bitlik bir tanımlayıcıdır ve metin gösterimi 36 karakterden oluşur. İlk 48 biti, Unix milisaniye cinsinden bir zaman damgasıdır. Kalan 80 bit ise kriptografik olarak güçlü bir rastgele sayı üreteci tarafından doldurulur. Bu yapı sayesinde UUID v7, hem oluşturulma zamanına göre sıralanabilir hem de tahmin edilemezlik özelliğini korur.
Zaman damgası, 1 Ocak 1970’ten bu yana geçen milisaniye sayısını onaltılık tabanda 12 karakter olarak kodlar. Örneğin, 2025 yılındaki bir zaman damgası yaklaşık 1.7 trilyon milisaniyeye karşılık gelir. Bu değer, UUID’nin ilk üç grubuna (8-4-4 karakterlik bölümler) yerleşir. Ardından gelen rastgele bölüm ise 4-12 karakterlik son iki grubu oluşturur. Standart gösterimde her grup tire ile ayrılır: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
Bu sayfada üretilen UUID v7’ler, tarayıcının crypto.getRandomValues() API’sini kullanır. Bu API, işletim sistemi düzeyinde rastgelelik sağladığı için tahmin edilmesi son derece zordur. Hiçbir parça BroBroGo sunucularına gönderilmez; tüm işlem kullanıcının yerel cihazında gerçekleşir. Sayfada herhangi bir seçenek değiştirildiğinde (sayı, büyük harf, tire durumu) yeni ID’ler anında yeniden üretilir.
Kronolojik Sıralamanın Veritabanı Performansına Etkisi
Veritabanlarında birincil anahtar olarak UUID v4 kullanıldığında, B-ağacı indekslerinde parçalanma (index fragmentation) yaygın bir sorundur. UUID v4’ün tamamen rastgele yapısı, yeni kayıtların indeksin herhangi bir noktasına eklenmesine neden olur. Bu durum, sayfa bölünmelerini artırır, disk I/O’sunu yükseltir ve ekleme performansını düşürür.
UUID v7 ise zaman damgası sayesinde yeni ID’leri kronolojik sırayla üretir. B-ağacındaki yeni eklemeler genellikle en sağdaki sayfaya yapılır. Bu, indeksin daha az yeniden düzenlenmesi gerektiği anlamına gelir. Pratikte, yüksek yazma trafiği olan sistemlerde UUID v7’ye geçiş, INSERT sorgularında %30’a varan hız artışı sağlayabilir (donanıma ve veritabanı ayarlarına bağlı olarak).
Ancak bu avantaj, aynı milisaniyede üretilen ID’ler için geçerli değildir. Aşağıda detaylandırılacağı gibi, UUID v7 aynı milisaniyede kesin bir sıralama garantisi vermez. Yine de, milyonlarca kayıt arasında genel zaman sıralaması çoğu kullanım senaryosu için yeterlidir.
UUID v7 ile UUID v4 Arasındaki Farklar
| Özellik | UUID v4 | UUID v7 |
|---|---|---|
| Zaman damgası | Yok | 48 bit Unix milisaniye |
| Rastgele bitler | 122 bit | 80 bit |
| Çarpışma olasılığı | 2^122’de 1 | 2^80’de 1 (aynı milisaniye içinde) |
| İndeks parçalanması | Yüksek | Düşük |
| Sıralanabilirlik | Yok | Zaman bazlı, gevşek |
| Karakter sayısı | 36 (tireli) | 36 (tireli) |
UUID v7’nin rastgele bit sayısı daha az olduğu için teorik olarak çarpışma olasılığı UUID v4’ten daha yüksektir. Ancak 2^80 olasılık (yaklaşık 1.2×10^24) pratikte yine de ihmal edilebilir düzeydedir. Bir milisaniyede milyarlarca ID üretilmediği sürece çarpışma görülmez.
Uygulamada, UUID v7’nin zaman damgası eklemesi, çoğu veritabanı indeksleme ve sorgulama senaryosunda UUID v4’e belirgin bir üstünlük sağlar. Özellikle zaman serisi verileri, olay kayıtları ve sıralı birincil anahtar gerektiren dağıtık sistemlerde tercih edilir.
Aynı Mili-Saniyede Üretilen ID’ler ve Sıralama Garantisi
Sayfanın bilgi notunda belirtildiği gibi: UUID v7 ve ULID, oluşturulma zamanına göre sıralanabilirdir ancak aynı milisaniye içinde üretilen ID’ler için kesin bir sıralama garantisi yoktur. Bunun nedeni, aynı zaman damgasına sahip ID’lerde sıralamanın tamamen rastgele bitlere bağlı olmasıdır.
Örneğin, aynı milisaniye içinde üç UUID v7 üretilirse:
0193b7e0-1234-5678-9abc-def0123456780193b7e0-2234-5678-9abc-def0123456790193b7e0-3234-5678-9abc-def012345670
Bu üç ID’nin ilk 12 karakteri (0193b7e0-1234) aynı olacaktır. Kalan kısım rastgele olduğu için, bu ID’ler alfabetik sıraya göre sıralanabilir ancak bu sıralama oluşturulma sırasını yansıtmaz. Eğer uygulamanız milisaniye altı kesin sıralama gerektiriyorsa, UUID v7 yerine sıralı sayaç veya zaman damgasına ek olarak artan sayaç ekleyen bir format (örneğin Twitter Snowflake) kullanmalısınız.
Bu gevşek sıralama, çoğu dağıtık sistem için kabul edilebilir bir ödünleşimdir. Paralel çalışan birden fazla işlemci veya farklı makineler aynı anda ID üretebilir ve bu ID’ler yine de yaklaşık olarak zaman sırasında yer alır. Veritabanı indeksleme, kayıtların kabaca kronolojik sırada eklenmesinden fayda görür; kesin sıra genellikle gerekli değildir.
Tarayıcı Tabanlı Yerel Üretim ve Gizlilik
Sayfa, UUID v7’leri tamamen tarayıcı içinde üretir. crypto.getRandomValues() API’si, işletim sisteminin güvenli rastgelelik kaynağını (Windows’ta BCryptGenRandom, Linux’ta /dev/urandom) kullanır. Bu, üretilen ID’lerin öngörülemezliğini garanti eder.
Hiçbir ID, kullanıcı bilgisi veya tarayıcı meta verisi sunucuya gönderilmez. Bu, hassas verilerle çalışan geliştiriciler için önemli bir gizlilik avantajıdır. Sayfada “Ready.” durumu, hiçbir ID üretilmediğini; “Generated.” durumu ise ID’lerin hazır olduğunu gösterir. “Copied all!” mesajı, tüm ID’lerin panoya kopyalandığını bildirir.
Ayrıca, kullanıcı tek bir ID’ye tıklayarak onu ayrı ayrı panoya kopyalayabilir. Bu, büyük listelerden yalnızca birkaç ID seçmek istediğinizde kullanışlıdır.
Kullanım Senaryoları: Dağıtık Sistemler, Olay İzleme, Denetim Kayıtları
UUID v7, kronolojik sıralamanın ve benzersizliğin birlikte gerektiği birçok alanda kullanılır:
- Dağıtık sistem birincil anahtarları: Birden fazla düğüm, merkezi bir koordinatör olmadan benzersiz ve sıralanabilir ID’ler üretebilir. Zaman damgası, ID’nin hangi düğümde oluşturulduğundan bağımsız olarak küresel sıralama sağlar.
- Olay kaynağı (event sourcing) ve mesaj kuyrukları: Her olayın benzersiz bir ID’si olur ve bu ID’ler zaman sırasına göre sıralanarak olay akışının yeniden oynatılmasını kolaylaştırır.
- Denetim kayıtları (audit logs): ID’nin ilk karakterlerinden kaydın ne zaman oluşturulduğu anlaşılabilir. Bu, log inceleme ve zaman bazlı filtreleme işlemlerini hızlandırır.
- Veritabanı migrasyonları: UUID v4 kullanan eski bir sistemden UUID v7’ye geçerken, yeni ID’lerin sıralı olması indeks performansını iyileştirir. Ancak eski kayıtlar geriye dönük sıralanamaz.
Sayfa, 1 ile 100 arasında ID üretilmesine izin verir. Bu, bir test veritabanı doldurmak, örnek veri kümeleri oluşturmak veya bir demo sırasında hızlıca ID listesi çıkarmak için idealdir.
Sık Sorulan Sorular (SSS)
1. UUID v7 her zaman sıralı mıdır? Hayır, yalnızca farklı milisaniyelerde üretilen ID’ler zaman sırasındadır. Aynı milisaniye içinde üretilenler rastgele sıralanır.
2. UUID v7 güvenli midir, tahmin edilebilir mi? Evet, rastgele kısmı kriptografik olarak güvenlidir. Zaman damgası bilinse bile rastgele 80 biti tahmin etmek imkansızdır.
3. Neden aynı milisaniyede üretilen ID’ler sıralı değil? Standart UUID v7, zaman damgası aynı olduğunda sıralamayı rastgele bitlere bırakır. Kesin sıralama için ayrı bir sayaç alanına ihtiyaç vardır (örneğin ULID’nin “timestamp + random” yapısı da aynı sorunu taşır).
4. Büyük harf kullanımı ID’nin işlevini değiştirir mi? Hayır. UUID v7 büyük/küçük harf duyarsız olarak aynı değeri temsil eder. Ancak veritabanındaki indeksleme, harf duyarlılığına bağlı olarak farklılaşabilir. Sayfadaki büyük harf seçeneği yalnızca görüntüleme amaçlıdır.
5. Kaç tane ID üretebilirim? Sayfa tek seferde 1 ile 100 arasında ID üretmenize olanak tanır. Daha fazlası için birden çok kez üretim yapabilirsiniz.
6. Sunucuya herhangi bir veri gönderiliyor mu? Hayır. Tüm hesaplama ve rastgelelik tarayıcınızda gerçekleşir. Ürettiğiniz ID’ler yalnızca sizin cihazınızda kalır.
7. UUID v7 ve UUID v4 arasında geçiş yaparken nelere dikkat etmeliyim? UUID v7’ye geçerken, mevcut v4 ID’lerinizi saklamanız ve yeni sistemde her iki formatı da destekleyecek alan (örneğin 36 karakter) ayırmanız gerekir. Ayrıca, v7’nin sıralanabilirliği yalnızca yeni kayıtlar için geçerlidir; eski v4 kayıtları geriye dönük sıralanamaz.