- Tür
- Sürüm 7: sıralanabilir Unix tarihi
- Varyant
- RFC 9562 (eski adıyla RFC 4122)
- Oluşturulma tarihi
- 22 Şub 2022 16:22:22 2022-02-22T19:22:22.000Z · 1645557742000 ms
017f22e2-79b0-7cc3-98c4-dc0c0c07398f017F22E2-79B0-7CC3-98C4-DC0C0C07398F{017F22E2-79B0-7CC3-98C4-DC0C0C07398F}urn:uuid:017f22e2-79b0-7cc3-98c4-dc0c0c07398f01FWHE4YDGFK1SHH6W1G60EECF017f22e279b07cc398c4dc0c0c07398f1989357241971137676463954034883508623AX8i4nmwfMOYxNwMDAc5jw==Nasıl çalışır
UUID, beş grupta (8-4-4-4-12) 32 onaltılık basamak olarak yazılan 128 bitlik bir sayıdır. Değerin kullanımda olup olmadığını kimseye sormadan bir kaydı tanımlamaya yarar: iki sunucu, iki mobil uygulama veya iki süreç koordinasyon olmadan ve çakışmadan aynı anda kimlik üretebilir. Biçim, 2024'te RFC 4122'nin yerini alan ve 6, 7 ve 8 sürümlerini ekleyen RFC 9562 ile tanımlanır.
Üçüncü grubu açan basamak sürümü gösterir ve her sürüm bitleri farklı düzenler. Sürüm 4 tamamen rastgeledir. Sürüm 7 milisaniye cinsinden tarihle başlar, böylece kimlikler oluşturulma sırasına göre dizilir. Sürüm 3 ve 5'te rastgele hiçbir şey yoktur: bir ad alanı ile bir adın hash'inden çıkar ve bu yüzden her zaman aynı sonucu verir. Sürüm 1 ve 6, 100 nanosaniye hassasiyetinde bir tarih ve tarihsel olarak bilgisayarın MAC adresi olan bir düğüm taşır.
Analiz aracı tersini yapar: sürümü ve varyantı okur, v1, v6 ve v7 UUID'lerinin ve ULID'lerin tarihini çıkarır ve aynı değeri GUID, URN, onaltılık, tamsayı veya Base64 olarak gösterir. Her şey tarayıcınızda hesaplanır; hiçbir kimlik sunucuya gönderilmez.
Örnekler
v5 · DNS · www.example.com2ed6657d-e927-568b-95e1-2665a8aea6a2Bu, RFC 9562'nin test vektörüdür. Sürüm 5'i doğru uygulayan her kütüphane, DNS ad alanındaki bu ad için tam olarak bu değeri döndürmelidir.017F22E2-79B0-7CC3-98C4-DC0C0C07398F2022-02-22T19:22:22.000ZBir v7 UUID'nin ilk 12 basamağı onaltılık Unix milisaniyeleridir: 0x017F22E279B0, 1645557742000'dir.C232AB00-9414-11EC-B3C8-9F6BDECED8461EC9414C-232A-6B00-B3C8-9F6BDECED846Aynı an sürüm 1 ve sürüm 6 olarak. Sürüm 6, metnin kronolojik sıralanması için tarih bitlerini en anlamlıdan en az anlamlıya dizer; saat dizisi ve düğüm değişmez.01ARZ3NDEKTSV4RRFFQ69G5FAV01563e3a-b5d3-d676-4c61-efb99302bd5bBir ULID, UUID ile aynı 128 biti kaplar, bu yüzden uuid sütununda saklanabilir. Ancak sürümü veya varyantı yoktur: UUID olarak okunduğunda o basamaklar rastgele kısmın parçasıdır.Kullanım senaryoları
- Veritabanının otomatik artan bir değer atamasını beklemeden birincil anahtarı istemcide veya birden fazla serviste aynı anda oluşturmak.
- Yeniden denenen bir ödeme veya siparişin iki kez işlenmemesi için idempotency anahtarları üretmek.
- Her isteği, birkaç mikroservisin logları boyunca izlemek için bir korelasyon kimliğiyle etiketlemek.
- İki sistemin ortak bir tablo paylaşmadan aynı değere ulaşması için doğal bir anahtardan (e-posta, URL, SKU) v5 ile kararlı bir kimlik türetmek.
- Bir log veya hata raporunda görünen v7 UUID'sinden ya da ULID'sinden kaydın ne zaman oluşturulduğunu öğrenmek.
- Test verilerini tek seferde yüzlerce geçerli kimlikle doldurmak.
Sık sorulan sorular
Birincil anahtar için v4 mü v7 mi?
Oluşturulma tarihini gizlemek için bir nedeniniz yoksa v7. B ağacı indeksleri anahtarları sıralı tutar ve bir v4 indeksin herhangi bir yerine düşer: her ekleme farklı bir sayfaya dokunur, sayfalar bölünür ve önbellek daha az verimli olur. v7 ise otomatik artan bir değer gibi her zaman sona eklenir. SQL Server'a dikkat: uniqueidentifier türü son altı bayttan başlayarak sıralar, bu yüzden orada v7 de sıralı olmaz.
İki v4 UUID aynı olabilir mi?
Teoride evet, pratikte hayır. Bir v4'te 122 rastgele bit vardır ve en az bir tekrar olasılığının %50'ye ulaşması için yaklaşık 2,7 × 10¹⁸ tane üretmek gerekir; yani 85 yıldan fazla boyunca saniyede bir milyar. Şart, kriptografik bir üreteç kullanmaktır: bildirilen gerçek tekrarlar matematikten değil, kötü başlatılmış tohum değerlerinden kaynaklanır.
UUID ve GUID aynı şey mi?
Evet, GUID Microsoft'un kullandığı addır ve metin aynıdır; Windows'ta genellikle büyük harfle ve süslü parantez içinde görünür. Fark ikili biçimdedir: .NET'teki Guid.ToByteArray ilk üç grubu little-endian olarak saklar; bu ham baytları başka bir dilden okursanız ilk basamakları ters sırada görürsünüz.
UUID'yi gizli belirteç olarak kullanabilir miyim?
İyi üretilmiş bir v4'te 122 öngörülemez bit vardır; tahmin edilmesi zor bir bağlantı için yeterlidir. Ancak RFC 9562, UUID'lerin kimlik bilgisi olarak tasarlanmadığını belirtir: birçok kütüphane kriptografik üreteç garanti etmez ve 1, 6 ve 7 sürümleri oluşturulma tarihini açığa çıkarır. Oturum veya parola sıfırlama belirteçleri için ayrı rastgele baytlar üretmek daha iyidir.
ULID mi UUID v7 mi?
Neredeyse aynı bilgiyi taşırlar: 48 bit milisaniye ve geri kalanı rastgele. ULID, tire veya belirsiz harf içermeyen 26 karakterle yazılır ve URL'de daha kullanışlıdır. v7 standart bir UUID'dir; bu yüzden dönüştürme gerekmeden PostgreSQL'in uuid sütunlarına ve her doğrulayıcıya uyar. Sıfırdan başlıyorsanız ve veritabanınızda uuid türü varsa v7.
v1 UUID'lerimdeki düğüm neden benim MAC adresim değil?
Çünkü ağ kartının MAC adresini açığa çıkarmak, her kimliği hangi makinenin oluşturduğunun izlenmesine olanak tanır; Melissa virüsünün yazarı 1999'da bu şekilde tespit edildi. RFC 9562, multicast biti açık rastgele bir düğüm kullanılmasını önerir ve bu araç da bunu yapar; analiz aracı bir v1 UUID gerçek bir MAC içerdiğinde sizi uyarır.