672 Stimmen

Ist eine GUID zu 100% eindeutig?

Ist eine GUID zu 100 % eindeutig?

Bleibt sie über mehrere Threads hinweg eindeutig?

31voto

Eric Z Beard Punkte 36325

Ja, eine GUID sollte immer eindeutig sein. Sie basiert sowohl auf der Hardware als auch auf der Zeit, plus ein paar zusätzliche Bits, um sicherzustellen, dass sie eindeutig ist. Ich bin sicher, dass es theoretisch möglich ist, zwei identische GUIDs zu erhalten, aber in der Praxis ist das extrem unwahrscheinlich.

Hier ist ein großartiger Artikel von Raymond Chen über Guids:

https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

30voto

Rob Walker Punkte 45267

Guids sind statistisch gesehen einzigartig. Die Wahrscheinlichkeit, dass zwei verschiedene Clients dieselbe Guid erzeugen, ist verschwindend gering (vorausgesetzt, der Code zur Erzeugung der Guid ist fehlerfrei). Sie können sich genauso gut Sorgen machen, dass Ihr Prozessor aufgrund eines kosmischen Strahls ausfällt und Sie heute beschließen, dass 2+2=5 ist.

Mehrere Threads, die neue Guids zuweisen, erhalten eindeutige Werte, aber Sie sollten sicherstellen, dass die Funktion, die Sie aufrufen, thread-sicher ist. In welcher Umgebung ist dies der Fall?

27voto

Paolo Moretti Punkte 50959

Eric Lippert hat eine sehr interessante Reihe von Artikeln über GUIDs geschrieben.

Es sind in der Größenordnung 2 30 Personal Computer in der Welt (und natürlich natürlich viele Handheld-Geräte oder Nicht-PC-Computer, die mehr oder weniger die gleiche Rechenleistung haben, aber lassen wir die diese). Nehmen wir an, dass wir all diese PCs auf der Welt mit der Aufgabe betrauen Aufgabe stellen, GUIDs zu erzeugen; wenn jeder von ihnen, sagen wir, 2 20 GUIDs pro Sekunde dann nach nur etwa 2 72 Sekunden einhundertfünfzig Billionen Jahre -- Sie haben eine sehr hoch Chance, eine Kollision mit Ihrer spezifischen GUID. Und die Wahrscheinlichkeit einer Kollision wird nach nur dreißig Billionen Jahren ziemlich gut.

25voto

Michael Haren Punkte 101002

Theoretisch, nein, sie sind nicht einzigartig. Es ist möglich, eine identische Guid immer und immer wieder zu erzeugen. Die Wahrscheinlichkeit, dass dies geschieht, ist jedoch so gering, dass man davon ausgehen kann, dass sie einmalig sind.

Ich habe schon einmal gelesen, dass die Wahrscheinlichkeit so gering ist, dass Sie sich lieber um etwas anderes kümmern sollten - z. B. um eine spontane Verbrennung Ihres Servers oder andere Fehler in Ihrem Code. Das heißt, gehen Sie davon aus, dass es einzigartig ist und bauen Sie keinen Code ein, um Duplikate "abzufangen" - verbringen Sie Ihre Zeit mit etwas, das wahrscheinlicher ist (d.h. alles sonst).

I angestrengt um die Nützlichkeit von GUIDs für mein Blogpublikum (nicht-technische Familienmitglieder) zu beschreiben. Von dort aus (über Wikipedia), die Chancen der Erzeugung einer doppelten GUID:

  • 1 zu 2^128
  • 1 von 340 Undezillionen (keine Sorge, Undezillion steht nicht auf der Quiz)
  • 1 zu 3,4 × 10^38
  • 1 zu 340.000.000.000.000.000.000.000.000.000.000.000.000.000

22voto

Cine Punkte 3977

Die tatsächliche mathematische Wahrscheinlichkeit des Eintretens wird nicht erwähnt.

Nehmen wir zunächst an, dass wir den gesamten 128-Bit-Raum nutzen können (Guid v4 verwendet nur 122 Bit).

Wir wissen, dass die allgemeine Wahrscheinlichkeit, KEIN Duplikat zu erhalten, in n pickt ist:

(1-1/2 128 )(1-2/2 128 )...(1-(n-1)/2 128 )

Weil 2 128 ist viel viel größer als n können wir dies annähernd berechnen:

(1-1/2 128 ) n(n-1)/2

Und weil wir davon ausgehen können n viel, viel größer als 0 ist, können wir uns diesem Wert annähern:

(1-1/2 128 ) n^2/2

Nun können wir dies mit der "akzeptablen" Wahrscheinlichkeit gleichsetzen, sagen wir 1 %:

(1-1/2 128 ) n^2/2 \= 0.01

Diese lösen wir für n und erhalten:

n = sqrt(2* log 0,01 / log (1-1/2 128 ))

Welches Wolfram Alpha wird zu einem 5.598318 × 10 19

Um diese Zahl in die richtige Perspektive zu rücken, nehmen wir an, dass 10000 Rechner mit jeweils 4 Kern-CPUs und einer Taktfrequenz von 4 GHz 10000 Zyklen benötigen, um einen Guid zu generieren und sonst nichts zu tun. Es würde dann ~111 Jahre dauern, bis sie ein Duplikat erzeugen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X