UUID'ler nerede kullanılır
UUID (evrensel benzersiz tanımlayıcı; Windows'ta GUID olarak da bilinir), beş gruba ayrılmış 32 onaltılık rakamla yazılan 128 bitlik bir değerdir: 8-4-4-4-12, örneğin 3f1c2b7e-9a4d-4c1e-8b2f-6d0e5a7c9b13. Asıl mesele, herhangi bir sistemin merkezi bir sayaca sormadan kendi başına bir UUID oluşturabilmesi ve yine de başka bir yerde oluşturulmuş bir kimlikle asla çakışmayacağından emin olabilmesidir.
Bu özellik pek çok yerde işe yarar:
- Veritabanlarında birincil anahtarlar; özellikle kayıtlar birkaç sunucuda ya da istemci cihazlarda çevrimdışı oluşturulup sonradan senkronize edildiğinde.
- Tek bir işlemi birçok servisin logları boyunca takip eden istek ve korelasyon kimlikleri.
- Yüklemeler için dosya adları; böylece
photo.jpgyükleyen iki kullanıcı birbirinin dosyasının üzerine asla yazmaz. - Ödeme ve sipariş API'leri için idempotency anahtarları.
- Gerçekçi kimliklere ihtiyaç duyan test verileri ve başlangıç verileri.
Sürüm 4 ve sürüm 7
Araç, bugün yeni işler için önemli olan iki sürümü sunar. İkisi de aynı formatta ve uzunluktadır; fark, bitlerin içinde ne olduğundadır.
UUID v4 (rastgele)
Sürümü ve varyantı belirten 6 sabit bit dışında 122 bitin tamamı rastgeledir. Bir v4'ü üçüncü grubun başındaki 4 ile tanıyabilirsiniz. Bunlar, işletim sisteminin kriptografik olarak güvenli rastgelelik kaynağından beslenen tarayıcının crypto.randomUUID() fonksiyonundan gelir.
Kimliğin hiçbir şey ele vermemesi gerektiğinde v4 kullanın: URL'lerdeki davet token'ları, herkese açık kaynak kimlikleri; bir kimliği bilmenin başka birini tahmin etmeye ya da ne zaman oluşturulduğunu anlamaya yardım etmemesi gereken her şey.
UUID v7 (zaman sıralı)
2024'te RFC 9562 ile standartlaştırılan v7, başa milisaniye cinsinden 48 bitlik bir Unix zaman damgası koyar ve kalan 74 biti rastgele veriyle doldurur. Üçüncü grup 7 ile başlar. Zaman damgası önde olduğu için v7 değerleri düz metin veya bayt olarak oluşturulma sırasına göre sıralanır.
Bu, veritabanları için önemlidir. B-tree dizinleri anahtarları sıralı saklar ve rastgele v4 anahtarları rastgele sayfalara düşer; tablolar milyonlarca satıra büyüdükçe sayfa bölünmelerine ve kötü önbellek kullanımına yol açar. Zaman sıralı anahtarlar, otomatik artan bir tamsayı gibi dizinin sonuna yakın eklenir ve "her yerde oluşturulabilir" özelliğini de korur. PostgreSQL, MySQL veya SQL Server'daki yeni tablolar için v7 genellikle daha iyi bir birincil anahtardır.
İki uyarı: zaman damgası okunabilir, bu yüzden bir v7 kaydın ne zaman oluşturulduğunu milisaniyesine kadar açığa vurur. Ve bu oluşturucu milisaniye altı bir sayaç eklemez; bu yüzden tek bir grup içinde olduğu gibi aynı milisaniyede üretilen kimlikler, kendi aralarında üretim sırasına göre değil rastgele kısımlarına göre sıralanır.
Bir tekrar ne kadar olasılık dışı
122 rastgele bitle yaklaşık 5,3 × 10^36 olası v4 değeri vardır. Doğum günü sınırına göre, tek bir çakışma için %50 olasılığa ulaşmak üzere bunlardan yaklaşık 2,7 × 10^18 tane üretmeniz gerekir. Saniyede bir milyar üretimle bu 80 yıldan fazla sürer.
v7'de rastgele kısım 74 bittir, ancak yalnızca aynı milisaniyede oluşturulan kimlikler arasında benzersiz olması gerekir. Milisaniyede bir milyon kimlikte bile çakışma olasılığı göz ardı edilebilir düzeyde kalır.
Pratikte tekrarlar matematikten değil hatalardan kaynaklanır: üretime kopyalanmış sabit kodlu bir örnek kimlik, tohumlanmış veya kriptografik olmayan bir rastgele sayı üreteci ya da durumu yeniden oynatan klonlanmış bir sanal makine. Tarayıcıda sistemin güvenli rastgeleliğiyle üretmek son ikisini önler.
Format ayrıntıları ve saklama
- Harf boyutu. RFC 9562, UUID'lerin küçük harfle yazılmasını ve büyük-küçük harf duyarsız karşılaştırılmasını söyler. Büyük harf seçeneği, Windows GUID stilini kullanan sistemler ve belgeler için vardır.
- Süslü parantezler ve tireler. Bazı Microsoft araçları GUID'leri
{süslü parantez}içinde gösterir. Bunları veya tireleri yalnızca hedef sistem o biçimi bekliyorsa kaldırın. - Saklama. UUID'leri
CHAR(36)yerine yerel bir türde saklayın (PostgreSQL'deuuid, MySQL'deBINARY(16)). İkili biçim 36 yerine 16 bayt yer kaplar ve daha hızlı karşılaştırılır. - Grup boyutu. Tek seferde 500'e kadar, her satırda bir tane; bir SQL betiğine veya elektronik tabloya yapıştırmaya hazır. Yeni oluştur düğmesine tıklamak listenin tamamını değiştirir.
UUID'ler sır değil, tanımlayıcıdır. Bir v4'ü tahmin etmek zordur, ancak bir şeye erişim sağlıyorsa bunu kimlik doğrulama olarak değil, bir kolaylık bağlantısı olarak görün. Kimlik bilgileri için Şifre oluşturucu kullanın. Bir v7'nin oluşturulma zamanını çözmek için ilk 12 onaltılık rakamını alın, ondalığa çevirin ve sayıyı Unix zaman damgası dönüştürücü aracına yapıştırın.