UUID'ler: Sürümler, Çakışmalar ve Veritabanı Anahtarları
UUID'lerin kayıtları nasıl tanımladığını, rastgele v4 ile zaman sıralı v7 farklarını, çakışma riskini ve veritabanı/uygulamalar için biçimlendirmeyi öğrenin.
Yazan: TIG Tools editorial teamYayınlanma: 26 Ekim 20265 dakikalık okuma
Bir UUID, merkezi bir numaralandırma hizmetine bağlı kalmadan bir nesneyi diğer nesnelerden ayırt etmek için tasarlanmış 128 bitlik bir tanımlayıcıdır. Yeni uygulamalar için yaygın olarak değerlendirilen iki sürüm; rastgele olan v4 ile bir zaman damgası içeren ve zamana göre sıralama için düzenlenmiş olan v7'dir. Aralarındaki farkları bilmek, veritabanı ve gizlilik ihtiyaçlarınıza uygun bir tanımlayıcı seçmenize yardımcı olur.
UUID'nin içeriği
UUID, İngilizce Universally Unique Identifier'ın kısaltmasıdır. Güncel belirtim RFC 9562'dir. Bir UUID, sürümünden bağımsız olarak 128 bit uzunluğundadır. Sürümü, bu bitlerin bir kısmının nasıl atandığını ve kalan alanların neyi temsil ettiğini belirler.
Bilinen metin biçimi, kısa çizgilerle ayrılmış beş bölüme gruplanmış 32 onaltılık basamaktan oluşur:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Her x bir onaltılık basamağı temsil eder. M konumu sürümü, N ile gösterilen yüksek bitler ise UUID varyantını belirtir. Örneğin bir v4 UUID şöyle görünür:
550e8400-e29b-41d4-a716-446655440000
Kısa çizgiler yalnızca okunabilir bir gösterimdir; ek veri değildir. UUID'ler genellikle onaltılık metin olarak gösterilir ancak sistemler aynı 128 biti yerel bir UUID türünde veya ikili biçimde saklayabilir. Kullanıma hazır bir tanımlayıcıya ihtiyaç duyduğunuzda bir UUID oluşturucu kullanın.
UUID v4: rastgele tanımlayıcılar
UUID v4, rastgele veya sözde rastgele verilerden üretilir. Sürüm ve varyant bitleri sabit anlamlara sahiptir; rastgele değerler için 122 bit kalır. İyi uygulanmış bir üretici uygun bir rastgele kaynak kullanır; tanımlayıcı yalnızca keyfi karakterler seçilerek veya öngörülebilir bir sayaç kullanılarak oluşturulmamalıdır.
v4 değerleri bir sıra veya zaman damgası kodlamadığı için farklı hizmetlerin veya cihazların tanımlayıcıları bağımsız olarak oluşturması gerektiğinde kullanışlıdır. Ayrıca zamana dayalı tanımlayıcılara göre daha az bilgi sızdırır: bir v4 değeri ne zaman üretildiğini doğrudan açığa çıkarmaz.
Rastgele UUID'ler, bir kopyanın matematiksel olarak imkânsız olduğunu garanti etmez. Bunun yerine olası değerlerin sayısı o kadar büyüktür ki üretim sağlam olduğunda çakışma olasılığı çok küçüktür. Bağımsız olarak üretilen n v4 UUID için çakışma olasılığının doğum günü yaklaşımı yaklaşık n(n − 1) / 2^123 kadardır; olasılık yine de küçük kalır. Bu yaklaşım rastgele bitlerin düzgün dağıldığını varsayar; zayıf veya hatalı bir rastgele üretici bunu geçersiz kılabilir.
UUID v7: zamana göre sıralı tanımlayıcılar
UUID v7, UUID'nin başına milisaniye cinsinden ölçülen 48 bitlik bir Unix zaman damgası yerleştirir. Kalan bitler; sürüm ve varyant işaretçilerini ve üretim yöntemine bağlı olarak rastgele veriler, sayaçlar veya bunların birleşimi için kullanılabilen 74 bit içerir.
Zaman damgası önce geldiği için v7 UUID'leri, standart bayt sıralamasında karşılaştırıldığında yaklaşık olarak oluşturulma zamanına göre sıralanacak şekilde tasarlanmıştır. Bu, kayıtları geldikçe depolayan ve dizinleyen veritabanlarına yardımcı olabilir: yeni tanımlayıcılar, rastgele v4 değerlerinde olabileceği gibi dizinin her yerine dağılmak yerine anahtar sıralamasında birbirine yakın olma eğilimindedir. Kesin fayda; veritabanına, UUID gösterimine ve dizin uygulamasına bağlıdır.
Zamana göre sıralama, garanti edilmiş küresel bir sıra ile aynı şey değildir. Aynı milisaniyede üretilen iki UUID, özellikle kalan bitleri rastgele ise oluşturuldukları sırada sıralanmayabilir. Makineler arasındaki saat farkları, saat ayarlamaları ve üreticinin sayaç stratejisi de sıralamayı etkiler. Kesin sıralama gerekiyorsa UUID v7'nin bunu sağladığını varsaymak yerine bu amaç için tasarlanmış bir sıra veya sıralama mekanizması kullanın.
Zaman damgası bir v7 UUID'sinde görünür. Bu, yaklaşık oluşturulma zamanını açığa çıkarabilir; bu nedenle v7 değerlerini herkese açık olarak paylaşmadan önce bu bilginin kabul edilebilir olup olmadığını değerlendirin. Zaman damgalarıyla çalışırken bir Unix zaman damgası dönüştürücü zaman değerlerini anlamlandırmaya yardımcı olabilir; ancak önce UUID'nin zaman damgası alanının kendi biçimine göre çıkarılması gerekir.
Pratikte çakışma riski
Çakışma, iki ayrı üretim olayı aynı UUID'yi ürettiğinde gerçekleşir. v4'te olasılık doğum günü etkisini izler: daha fazla değer oluşturuldukça şans artar ancak üretici güvenilir olduğunda sıradan uygulama ölçeğinde son derece düşük kalır. Çakışmaların imkânsız olduğunu söylemek doğru değildir.
v7 için zaman damgası, aynı milisaniyede oluşturulan tanımlayıcılar için olası değer aralığını azaltır. Belirli bir milisaniyede kullanılabilen 74 bit bağımsız rastgele ise o milisaniyede üretilen m UUID için yaklaşık çakışma olasılığı m(m − 1) / 2^75 olur. Gerçek üreticiler sayaçlar veya başka stratejiler kullanabilir; bu nedenle kesin davranış uygulamalarına bağlıdır. Örneğin TIG UUID üreticisi, aynı milisaniyede oluşturulan v7 UUID'leri için 12 bitlik bir sayaç kullanır (RFC 9562, bölüm 6.2'deki yöntem) ve 62 rastgele bit bırakır; böylece oluşturduğu bir grup, oluşturulma sırasına göre sıralanır.
Uygulamalar yine de depolamada benzersizliği zorunlu kılmalıdır. Birincil anahtar veya benzersizlik kısıtı yalnızca olasılığa güvenmek yerine kopyaları yakalar. Bir çakışma oluşursa uygulama uygun olduğunda başka bir tanımlayıcı üretebilir ve yeniden deneyebilir. UUID'ler ayrıca bir kaydın gerçek, gizli veya yetkili olduğunu kanıtlamaz: erişim denetimi ayrıca ele alınmalıdır.
Veritabanı anahtarları olarak UUID'ler
UUID'ler; kayıtlar birden fazla hizmet tarafından, ayrı makinelerde veya çevrimdışıyken oluşturulabildiğinde birincil anahtar olarak kullanışlıdır. Her sistem yerel olarak bir tanımlayıcı üretebilir ve sonraki numarayı merkezi bir hizmete sormadan kayıtları paylaşabilir. UUID'ler ayrıca basit bir kayıt sayacını açığa çıkarmayı önler; ancak bir güvenlik sınırı olarak görülmemelidir.
Bazı ödünler vardır. Bir UUID, 32 bit veya 64 bit bir tamsayı anahtardan daha büyüktür ve UUID'ler üzerindeki dizinler daha fazla yer kaplayabilir. Rastgele v4 değerleri, ağaç tabanlı bir dizinde farklı konumlara eklenebilir; bu da zamana göre sıralı anahtarlara kıyasla daha az sıralı dizin etkinliğine yol açabilir. UUID v7, yaygın ekleme desenleri için yerelliği iyileştirebilir ancak her veritabanı sorgusunu hızlandırmaz ve doğru şema ile dizin seçimlerinin yerini almaz.
Mümkün ve uygun olduğunda veritabanının yerel UUID türünü seçin. Aksi takdirde 128 bitlik değeri tutarlı biçimde ikili veya standart metin olarak saklayın. Karşılaştırmaları zorlaştıracak şekilde gösterimleri karıştırmaktan veya harf büyüklüğü ile kısa çizgi kurallarını değiştirmekten kaçının. UUID metni API'ler ve günlükler için kullanışlıdır; veritabanınız ve uygulamanız tutarlı biçimde ele alıyorsa dahili olarak kompakt ikili depolama uygun olabilir.
UUID'leri biçimlendirme ve işleme
Değişim için 8-4-4-4-12 onaltılık karakterden oluşan standart beş bölümlü biçimi kullanın. Sürüm, üçüncü grubun ilk basamağında görünür; bu nedenle 4 v4'ü, 7 ise v7'yi belirtir. UUID'ler tanımlayıcıdır, üzerinde aritmetik yapılacak değerler değildir; alıcı sistem o gösterimi beklemiyorsa karakterleri kaldırmayın veya yeniden biçimlendirmeyin.
Girdiyi doğrularken beklenen yapıyı ve ilgiliyse sürümün uygulamanızın kabul ettiği sürümlerden biri olup olmadığını kontrol edin. Yapısal olarak geçerli bir UUID yine de hiçbir kayda karşılık gelmeyebilir ve biçimini kontrol etmek sahiplik veya izin oluşturmaz. UUID'leri URL'lere, JSON'a veya veritabanı sorgularına kopyalarken tam değeri koruyun ve SQL'e eklerken parametreli sorgular kullanın.
Örneğin bir sipariş hizmeti ile bir kargo hizmeti, ortak bir sayısal sayacı koordine etmeden kayıt oluşturabilir. Bağımsız üretim ve zamanın açığa çıkmaması öncelikliyse v4; zamana dayalı dizin davranışı yararlıysa ve yaklaşık oluşturulma zamanının gösterilmesi kabul edilebilirse v7 kullanabilirler. Her iki durumda da veritabanı benzersizliği zorunlu kılmalı ve hizmetler aynı UUID biçimi ile depolama türü üzerinde anlaşmalıdır.
Özet
- UUID'ler 128 bitlik tanımlayıcılardır; genellikle kısa çizgilerle ayrılmış 32 onaltılık basamak olarak yazılır.
- UUID v4 rastgele veriler kullanır; UUID v7 milisaniyelik zaman damgasını başa koyar ve zamana göre sıralama için tasarlanmıştır.
- Çakışmalar sağlam üretimle düşük olasılıklıdır, imkânsız değildir; bir veritabanı benzersizlik kısıtı kullanın.
- UUID'ler dağıtık veritabanı anahtarlarını destekleyebilir ancak sır veya yetkilendirme belirteci değildir.
Şimdi dene
UUID Oluşturucu aracını doğrudan tarayıcınızda ücretsiz kullanın. Kayıt gerekmez ve dosyalarınız cihazınızda kalır.
UUID Oluşturucu aracını aç