Ruby için UUID oluşturucusunu / ayrıştırıcısını yazdım, bu yüzden kendimi konu hakkında oldukça iyi bilgilendirilmiş olarak görüyorum. Dört ana UUID sürümü vardır:
Sürüm 4 UUID'ler, aslında UUID sürümünü ve varyantını tanımlamak için biraz bit döndürme ile şifreleme açısından güvenli bir rasgele sayı üretecinden alınan 16 baytlık rasgeleliktir. Bunların çarpışması son derece düşük bir ihtimaldir, ancak bir PRNG kullanılırsa veya gerçekten, gerçekten, gerçekten, gerçekten, gerçekten kötü bir şansa sahip olursanız olabilir.
Sürüm 5 ve Sürüm 3 UUID'leri, bir UUID oluşturmak için bir ad alanını zaten benzersiz bir veri parçasıyla birleştirmek için sırasıyla SHA1 ve MD5 karma işlevlerini kullanır. Bu, örneğin, bir URL'den bir UUID oluşturmanıza izin verecektir. Buradaki çarpışmalar, yalnızca temeldeki hash fonksiyonunun da bir çarpışması varsa mümkündür.
Sürüm 1 UUID'leri en yaygın olanlardır. Ağ kartının MAC adresini (sahte olmadıkça benzersiz olmalıdır), artı bir zaman damgası ve UUID'yi oluşturmak için olağan bit döndürmeyi kullanırlar. MAC adresi olmayan bir makine durumunda, 6 düğüm baytı kriptografik olarak güvenli bir rastgele sayı üreteci ile üretilir. Zaman damgası önceki UUID ile eşleşecek kadar hızlı sırayla iki UUID üretilirse, zaman damgası 1 artırılır. Aşağıdakilerden biri olmadıkça çarpışmalar meydana gelmemelidir: MAC adresi sahte; İki farklı UUID üreten uygulamayı çalıştıran bir makine, aynı anda UUID'ler üretir; Ağ kartı olmayan veya MAC adresine kullanıcı düzeyinde erişimi olmayan iki makineye aynı rastgele düğüm sırası verilir ve aynı anda UUID'ler oluşturulur;
Gerçekçi olarak, bu olayların hiçbiri tek bir uygulamanın kimlik alanında tesadüfen meydana gelmez. Örneğin, İnternet çapında bir ölçekte veya kötü niyetli kişilerin bir kimlik çakışması durumunda kötü bir şey yapabilecekleri güvenilmeyen bir ortamda kimlikleri kabul etmediğiniz sürece, bu endişelenmeniz gereken bir şey değildir. Benimle aynı sürüm 4 UUID'sini üretirseniz çoğu durumda önemli olmadığını anlamak çok önemlidir. Kimliği sizinkinden tamamen farklı bir kimlik alanında oluşturdum. Başvurum asla çarpışmayı bilmeyecek, bu yüzden çarpışmanın önemi yok. Açıkçası, kötü niyetli aktörlerin olmadığı tek bir uygulama alanında, dünyadaki tüm yaşamın yok olması, siz bir sürüm 4 UUID'de bile çarpışmadan çok önce gerçekleşecektir.
Ayrıca 2 ^ 64 * 16, 256 eksabayttır. Olduğu gibi, tek bir uygulama alanında% 50 bir kimlik çarpışması olasılığınız olmadan önce 256 eksabayt değerinde kimlik depolamanız gerekir.