Ad, bazı ad alanlarında benzersiz olan bir tanımlayıcıdan başka bir şey değildir. Sorun, ad alanlarının genellikle oldukça küçük olması ve birindeki adların genellikle diğerlerindeki adlarla çakışmasıdır. Örneğin, arabamın plaka numarası (adı) eyalet DMV ad alanında benzersizdir, ancak muhtemelen dünyada benzersiz değildir; diğer durum DMV'leri kendi ad alanlarında aynı adı kullanmış olabilir. Heck, başka birinin de eşleşen bir telefon numarası (adı) olabilir, çünkü bu başka bir ad alanı vb.
UUID'ler, her şey için benzersiz bir ad sağlayabilecek kadar geniş tek bir ad alanında yer alıyor olarak görülebilir ; bu "evrensel" demek. Ancak diğer ad alanlarındaki mevcut adları bir UUID ile nasıl eşlersiniz?
Açık bir çözüm, ayrık ad alanlarındaki eski adları değiştirmek için her öğe için bir UUID (V1 veya V4) oluşturmaktır. Olumsuz yanı, çok daha büyük olmaları, tüm yeni isimleri veri kümenizin bir kopyasına sahip olan herkese iletmeniz, tüm API'lerinizi güncellemeniz vb. Muhtemelen eski isimlerden tamamen kurtulamamanızdır. her neyse, bu artık her öğenin iki adı olduğu anlamına geliyor , yani işleri daha iyi mi yoksa daha kötü mü yaptınız?
Bu, V3 / V5'in devreye girdiği yerdir. UUID'ler , V4 kadar rastgele görünür , ancak gerçekte deterministiktir; Bir ad alanı için doğru UUID'ye sahip olan herhangi biri, o ad alanı içindeki herhangi bir ad için aynı UUID'yi bağımsız olarak oluşturabilir. Bunları hiç yayınlamanıza veya önceden oluşturmanıza bile gerek yok, çünkü ihtiyaç duyulduğunda herkes anında oluşturabilir!
DNS adları ve URL'ler çok yaygın olarak kullanılan ad alanlarıdır, bu nedenle bunlar için standart UUID'ler yayınlanmıştır; ASN.1 OID'ler ve X.500 adları o kadar yaygın değildir, ancak standart kurumları onları sever, bu nedenle onlar için de standart ad alanı UUID'leri yayınladılar.
Diğer tüm ad alanları için, kendi ad alanı UUID'nizi (V1 veya V4) oluşturmanız ve ihtiyacı olan herkese iletmeniz gerekir. Birkaç ad alanınız varsa, her biri için UUID'yi yayınlamak zorunda olmak kesinlikle ideal değildir.
İşte hiyerarşinin devreye girdiği yer burasıdır: Bir "temel" UUID (her türden) yaratırsınız ve sonra bunu diğer ad alanlarınızı adlandırmak için bir ad alanı olarak kullanırsınız! Bu şekilde, yalnızca temel UUID'yi yayınlamanız gerekir (veya açık olanı kullanmanız gerekir) ve herkes geri kalanını hesaplayabilir.
Örneğin, StackOverflow için bazı UUID'ler oluşturmak istediğimizde kalalım; DNS ad alanında açık bir adı vardır, bu nedenle temel açıktır:
uuid ns_dns = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
uuid ns_base = uuidv5(ns_dns, 'stackoverflow.com');
StackOverflow'un kendisi, kullanıcılar, sorular, cevaplar, yorumlar vb. İçin ayrı ad alanlarına sahiptir, ancak bunlar da oldukça açıktır:
uuid ns_user = uuidv5(ns_base, 'user');
uuid ns_question = uuidv5(ns_base, 'question');
uuid ns_answer = uuidv5(ns_base, 'answer');
uuid ns_comment = uuidv5(ns_base, 'comment');
Bu özel soru # 10867405, dolayısıyla UUID'si şöyle olacaktır:
uuid here = uuidv5(ns_question, '10867405');
Bu süreçte rastgele bir şey olmadığına dikkat edin , bu nedenle aynı mantığı izleyen herkes aynı cevabı alacaktır, ancak UUID ad alanı o kadar geniştir ki (122 bitlik şifreleme karmasının güvenliği göz önüne alındığında etkili bir şekilde) asla bir Diğer herhangi bir ad alanı / ad çiftinden üretilen UUID.