Bir GUID'in her zaman benzersiz olacağını varsaymak güvenli midir?


123

Bir dakika çakışma olasılığı olduğunu biliyorum, ancak 1000 GUID'lik bir grup oluşturursam (örneğin), bunların her birini test etmeyi kaydetmek için benzersiz olduklarını varsaymak güvenli olur mu?

Bonus soru

Bir GUID'i benzersizlik açısından test etmenin en iyi yolu? Bloom filtresi belki?



29
Hepimiz bu sitedeki yeniden yükleme düğmesini ezmeye
mipadi

12
GUID çarpışmalarındaki tüm hatalarımı suçluyorum. Bir ara olması gerekiyor, değil mi?
Michael

8
Ekose desenli güzel bir renge sahip bir köpekbalığının gökten düşmesi ve bilgisayarınızı parçalara ayırması çok daha olasıdır, bu nedenle buna karşı önlem almanın, genel risk azaltmanızın bir parçası olarak daha uygun bir kaynak tahsisi olduğunu belirtmek isterim. plan.
David Gladfelter

4
@mipadi: harika bağlantı! Bir yerlerde bir geliştiricinin "Guuuuys! GUID'leri boşa harcamayı bırakın! Bunlara ihtiyacım var !"
FrustratedWithFormsDesigner

Yanıtlar:


360

Evet yapabilirsin. GUID'ler 128 bit uzunluğunda olduğundan kuşkusuz bir dakikalık bir çakışma olasılığı vardır - ancak "dakika" kelimesi yeterince güçlü değildir. Orada o kadar çok GUIDs Oluşturduğunuz eğer birkaç trilyon rastgele bunların, yine (hatta bir çarpışmayı olması daha bir göktaşı çarptı olsun olasılığının daha yüksek olduğu Wikipedia ). Ve bunları rastgele oluşturmuyorsanız, ancak örneğin MAC adresi ve zaman damgası algoritmasını kullanıyorsanız, MAC adresleri bilgisayarlar arasında benzersiz olduğundan ve zaman damgaları cihazınızda benzersiz olduğundan, bunlar da benzersiz olacaktır . bilgisayar.

Düzenleme 1: Bonus sorunuzu yanıtlamak için, bir dizi GUID'i benzersizlik açısından test etmenin en iyi yolu, hepsinin benzersiz olduğunu varsaymaktır. Neden? Çünkü, oluşturduğunuz GUID'lerin sayısı göz önüne alındığında, bir GUID çarpışmasının olasılığı, bilgisayarınızın belleğinde bir miktar dönüp önemsediğiniz herhangi bir "doğru" algoritmanın verdiği cevabı bozan kozmik bir ışının olasılığından daha küçüktür. koşmak. ( Matematik için bu StackOverflow cevabına bakın .)

Orada çok sayıda GUID var. Douglas Adams'ın Otostopçunun Galaksi Rehberi'nden alıntı yapacak olursak :

"Uzay," diyor, "büyük. Gerçekten büyük. Ne kadar büyük bir akıllara durgunluk verecek kadar büyük olduğuna inanmayacaksınız. Demek istediğim, kimyacıya giden yolda çok uzun bir yol olduğunu düşünebilirsiniz, ama bu sadece uzaya fıstık , dinle ... "

Ve evrende yaklaşık 7 × 10 22 yıldız ve 2 128 GUID'in biraz altında olduğu için, her bir yıldız için yaklaşık olarak 4.86 × 10 15 — neredeyse beş katrilyon — GUID vardır. Bu yıldızların her birinin bizimki gibi gelişen bir nüfusa sahip bir dünyası olsaydı, o zaman her yıldızın etrafında, şimdiye kadar yaşamış olan her insan veya uzaylı kırk beş binden fazla GUID'e hak kazanırdı. Evrendeki her yıldızda tarihin her insanı için. GUID alanı, tüm evrenin boyutuyla aynı büyüklüktedir. Sen do not endişe gerekir.

( Düzenleme 2: Bunun üzerine düşünmek : vay. Bunun ne anlama geldiğini kendime anlamamıştım. GUID alanı anlaşılmaz derecede büyük. Buna hayranlık duyuyorum.)


1
Ayrıca WolframAlpha, şimdiye kadar yaşamış her insanın her hücresinde 36 trilyon UUID olduğunu bildiriyor. 10^14Vücudunuzda yaklaşık hücre var ve 106,5 milyar insan yaşamıştır. Veya 2.385 * 10^23ABD kamu borcundaki her kuruş için UUID'ler.
new123456

5
Rakamlar hala yüksek olsa da, 2 ^ 64 GUID'de GUID çakışması olasılığı% 50'nin üzerindedir.
NullUserException

1
2 ^ 64 GUID'de bu, sayıları Evrendeki yıldız başına birden (0.00026) ve şimdiye kadar yaşamış her insan veya uzaylı için 2 * 10 ^ (- 15) olacak şekilde azaltacaktır. Bu hala yaşamış her insan için 170 milyondan fazla GUID'e izin verecektir , bu yüzden hala iyiyiz diye düşünüyorum.
NullUserException

12
Bir GUID çarpışmasının yalnızca aynı iş alanında olması durumunda bir sorun olduğunu da belirtmek gerekir. Bir yazılım parçasındaki bir bileşeni tanımlamak için kullandığım bir GUID, herhangi bir soruna neden olmadan kendi uygulamanızdaki bir veritabanı satırında kullandığınız GUID ile aynı olabilir
James Thorpe

1
2 ^ 128 REHBER olduğu gerçeği konu dışıdır ve% 50 çarpışma ihtimalinde "hala iyi" değilsiniz,% 0.0000001 bile iyi değilsiniz
BlackTigerX

40

Kısa cevap: pratik amaçlar için, evet.

Ancak, doğum günü paradoksunu göz önünde bulundurmalısınız!

Birkaç temsili çarpışma olasılığı hesapladım. Wikipedia makalesinde belirtildiği gibi 122 bit UUID'lerle, en az 2.71492e18UUID üretirseniz çarpışma olasılığı 1 / 2'dir . 10 ^ 19 UUID ile olasılık 0,999918'dir. 10 ^ 17 UUID ile 0.000939953.

Karşılaştırma için bazı rakamlar Wikipedia'da bulunabilir. Böylece, yaşamış olan her insan, gözlemlenebilir evrendeki her galaksi, okyanustaki her balık ve dünyadaki her bir karınca için güvenli bir şekilde bir UUID atayabilirsiniz. Bununla birlikte , insanlığın bir yılda ürettiği her transistör için bir UUID oluşturursanız, Dünya'daki her böcek, Dünya'daki her bir kum tanesi, gözlemlenebilir evrendeki her yıldız veya daha büyük herhangi bir şey için çarpışmalar neredeyse kesindir.

Saniyede 1 milyar UUID oluşturursanız, % 10'luk bir çarpışma olasılığı elde etmek yaklaşık 36 yıl alır .

Sonunda, insanlık tarihi boyunca üretilen UUID'ler arasında muhtemelen bir çarpışma olacak. Yine de, çarpışan UUID'lerin aynı amaç için kullanılma olasılığı kaybolacak kadar küçüktür, bu nedenle pratikte herhangi bir sorun yoktur.


13
Evren böyle bitiyor ... Bazı programcılar GUID'lerinin mega Ölüm Yıldızı için her zaman benzersiz olacağını varsayıyor ...
pkr298

UUID'ler rastgele olmayan verilere dayandığından, 36 yıl - yalnızca her milisaniye için ayrı ayrı endişelenmeniz gerekir.
mjaggard

@mjaggard UUID'leri rastgele verilere dayalıdır. Her neyse, modern türden.
Trejkaz

8

Çarpışma olasılığının bir analizi Wikipedia'da mevcuttur: http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

Bağlantıda belirtildiği gibi, bu rastgele sayı üretecinin özelliklerinden etkilenecektir.

GUID oluşturucu kodunda da bir hata olasılığı vardır; şansı düşükken, muhtemelen matematiğe dayalı bir çarpışma olasılığından daha yüksektir.

Bir Bloom filtresi uygun olabilir; bir GUID'in benzersiz olup olmadığını hızlı bir şekilde söyleyebilir, ancak bir çarpışmanın yanlış belirtilmesi ihtimali vardır. Bir seferde bir toplu işi test ediyorsanız alternatif bir yöntem, toplu işi sıralamak ve ardışık her öğeyi karşılaştırmaktır.


5

Genel olarak, evet varsaymak güvenlidir.

GUID oluşturucunuz gerçekten rastgele ise, 1000 GUID içinde çakışma olasılığı olağanüstü derecede küçüktür.

Tabii ki, bu iyi bir GUID oluşturucu olduğunu varsayar. Öyleyse soru gerçekten GUID oluşturmak için kullandığınız araca ne kadar güvendiğinizle ilgili ve kendi testleri var mı?


0

Bir çarpışma mümkün olsa da, bu YÜKSEK ŞEKİLDE olası değildir. ( Burada matematik .) Aslında farklı olduklarını varsaymak güvenlidir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.