Ist eine GUID 100% der Zeit eindeutig?

519

Ist eine GUID 100% der Zeit eindeutig?

Wird es über mehrere Threads hinweg einzigartig bleiben?

David Basarab
quelle
264
Nein, nicht 100% ... Nur 99.9999999999999999999999999999999999999999999999999999999999999999999999999999%;)
JohannesH
52
Erstens ist eine GUID nicht unendlich, was bedeutet, dass für die wörtliche Bedeutung von "100% der Zeit" bedeutet dies, dass sie immer eindeutig sind, egal wie lange Sie GUIDs generieren. Das ist nicht der Fall. Da die ursprüngliche Implementierung, bei der die eindeutige Seriennummer / ID / MAC der Netzwerkkarte zur Herstellung eines Teils des Schlüssels verwendet wurde, aus verschiedenen Gründen nicht mehr verwendet wird, ist eine GUID nicht mehr wirklich global eindeutig. Es ist jedoch lokal einzigartig. Mit anderen Worten, wenn Sie weiterhin GUIDs auf einem einzelnen Computer generieren, erhalten Sie keine Duplikate.
Lasse V. Karlsen
36
@ojrac Ich entscheide mich nur abzurunden ...: P
JohannesH
403
Jedes Mal, wenn ich eine GUID generiere, habe ich das Gefühl, eine aus dem Universum zu stehlen. Manchmal denke ich an böse Menschen, die viel mehr GUIDs generieren als sie brauchen und diese verschwendeten GUIDs sind so einsam, dass sie nicht verwendet oder erneut generiert werden ...
asavartsov
29
@asavartsov Ich denke, Sie werden wasteaguid.info mögen ^ _ ^
Navin

Antworten:

431

Während nicht garantiert wird, dass jede generierte GUID eindeutig ist, ist die Gesamtzahl der eindeutigen Schlüssel (2 128 oder 3,4 × 10 38 ) so groß, dass die Wahrscheinlichkeit, dass dieselbe Nummer zweimal generiert wird, sehr gering ist. Betrachten Sie zum Beispiel das beobachtbare Universum, das etwa 5 × 10 22 Sterne enthält. Jeder Stern könnte dann 6,8 × 10 15 universell eindeutige GUIDs haben.

Aus Wikipedia .


Dies sind einige gute Artikel darüber, wie eine GUID erstellt wird (für .NET) und wie Sie dieselbe Anleitung in der richtigen Situation erhalten können.

https://ericlippert.com/2012/04/24/guid-guide-part-one/

https://ericlippert.com/2012/04/30/guid-guide-part-two/

https://ericlippert.com/2012/05/07/guid-guide-part-three/

Wenn Sie

Adam Davis
quelle
115
Würden sie dann nicht als UUID bezeichnet werden? ;)
Arafangion
28
Eine GUID ist Microsofts spezifische Implementierung des UUID-Standards. Es ist also beides. Global eindeutige ID vs Universell eindeutige ID.
Adam Davis
40
Technisch gesehen ist es nicht 2 ^ 128, da Sie in einer v4-GUID eine hexadezimale Ziffer haben, die immer eine 4 ist (effektiv 4 Bits entfernen), und zwei Bits weiter sind ebenfalls reserviert. 2 ^ 122 gültige V4-GUIDs lassen jedoch immer noch ungefähr 5x10 ^ 36 übrig, was für mich ausreichend ist. und für dich auch. Jeder Stern muss nur etwa 1,1 x 10 ^ 14 GUIDs pro Stück akzeptieren.
Andrew Shelansky
67
Wenn Sie wie ich sind, möchten Sie wissen, dass 2^128das Ausgeschriebene ungefähr ist : 34,028,236,692,093,846,346,337,460,743,177,000,000. Statistisch gesehen würde es immer noch Billionen von Jahren dauern, bis Sie ein Duplikat erhalten, wenn Sie 1000 GUIDs pro Sekunde berechnen.
Entität
26
Ich fand es einfach lustig, es vorzulesen, also viel Spaß, Leute :) Vierunddreißig Undecillion achtundzwanzig Dezillion zweihundertsechsunddreißig Nonillion sechshundertzweiundneunzig Oktillion neunundneunzig Septillion achthundertsechsundvierzig Sextillion dreihundertsechsundvierzig Billionen dreihundertsiebenunddreißig Billiarde vierhundertsechzig Billionen siebenhundertdreiundvierzig Milliarden einhundertsiebenundsiebzig Millionen
hjavaher
85

Wenn Sie Angst vor denselben GUID-Werten haben, stellen Sie zwei davon nebeneinander.

Guid.NewGuid().ToString() + Guid.NewGuid().ToString();

Wenn Sie zu paranoid sind, setzen Sie drei.

Bura Chuhadar
quelle
64
Sie müssen sehr, sehr, sehr, sehr paranoid sein, um 3 GUIDs anzuhängen.
Harsimranb
25
@ Harsimranb Nein ... sehr, sehr, sehr, sehr paranoid ist 6 GUIDs. Paranoid ist eine angehängt, sehr paranoid ist zwei angehängt usw.
Suamere
37
@Suamere Ich habe eine Website zur Berechnung Ihres paranoiden Niveaus erstellt. Jogge.github.io/HowParanoidAmI
Jogge
3
@ Jogge xD Das ist unglaublich, lol. Nach 9 9 999999999in Ihrem Formular denke ich, dass Paranoia meinen Browser a-splodieren wird.
Suamere
66

Die einfache Antwort lautet ja.

Raymond Chen hat einen großartigen Artikel über GUIDs geschrieben und warum Teilzeichenfolgen von GUIDs nicht garantiert eindeutig sind. Der Artikel befasst sich eingehend mit der Art und Weise, wie GUIDs generiert werden, und den Daten, die sie verwenden, um die Eindeutigkeit sicherzustellen. Dies sollte einige Zeit dauern, um zu erklären, warum sie so sind :-)

ljs
quelle
23
Ich denke, Chens Artikel bezieht sich auf V1 des GUID-Generierungsalgorithmus, der eine MAC-Adresse und einen Zeitstempel verwendet - die aktuelle V4 verwendet stattdessen eine Pseudozufallszahl: en.wikipedia.org/wiki/Globally_Unique_Identifier#Algorithm
Barrett
2
Der Link ist tot - 403 Verboten
Daya
Hier ist der Link: devblogs.microsoft.com/oldnewthing/20080627-00/?p=21823
Olanrewaju O. Joseph
39

Als Randnotiz habe ich mit Volume GUIDs in Windows XP herumgespielt. Dies ist ein sehr dunkles Partitionslayout mit drei Festplatten und vierzehn Volumes.

\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
                                     | | | | |
                                     | | | | +-- 6f = o
                                     | | | +---- 69 = i
                                     | | +------ 72 = r
                                     | +-------- 61 = a
                                     +---------- 6d = m

Es ist nicht so, dass die GUIDs sehr ähnlich sind, sondern die Tatsache, dass alle GUIDs die Zeichenfolge "mario" enthalten. Ist das ein Zufall oder gibt es eine Erklärung dafür?

Als ich nun nach Teil 4 in der GUID googelte, fand ich ungefähr 125.000 Treffer mit Volumen-GUIDs.

Fazit: Wenn es um Volume-GUIDs geht, sind sie nicht so eindeutig wie andere GUIDs.

Jonas Gulle
quelle
31
Erinnerst du dich an die Super Mario Bros 3 Anzeige aus den 80ern? Alle diese Leute schreien "Mario! Mario! Mario!" auf der ganzen Welt störte die Zufälligkeit des Universums ein wenig.
MGOwen
24
Wenn Sie Office 2010 mit manuell deinstallieren msiexec, werden alle MSI-GUIDs des Office-Programms aufgelistet. Sie alle buchstabieren 0FF1CE. Microsoft scheint eine ziemlich ... lockere ... Interpretation zu haben, wie eine GUID generiert wird;)
Mark Henderson
3
Diese Partitions-GUIDs wurden alle zusammen am 17.12.2009 um 14:47:45 UTC erstellt. Sie sind für Ihren Computer eindeutig, aber die Angabe von "mario" als Knotenkennung ist falsch - dies bedeutet, dass sie nicht RFC-4122-kompatibel sind. Ebenso 0FF1CEfallen die GUIDs unter den Abschnitt "NCS-Abwärtskompatibilität" von RFC-4122, aber es ist unwahrscheinlich, dass Microsoft die NCS-Regeln für diese Werte befolgt.
Stephen Cleary
16
Ich wusste es, die Nintendo Security Administration hat die Zufallszahlengeneratoren kompromittiert.
MetaGuru
1
Vielleicht ist es der gleiche Ballpark wie der Name des Unternehmens, das ein Mineralwasser herstellt (gehört, dass sie den Markt anführen). Evian. Rückwärts geschrieben gibt Naive :-)
Mariusz
31

Es sollte nicht passieren. Wenn .NET jedoch stark ausgelastet ist, können doppelte Anleitungen abgerufen werden. Ich habe zwei verschiedene Webserver mit zwei verschiedenen SQL-Servern. Ich ging zum Zusammenführen der Daten und stellte fest, dass ich 15 Millionen Guids und 7 Duplikate hatte.

Tim
quelle
1
Wie ist das auf zwei verschiedenen Maschinen möglich? Ich dachte, ein Teil der GUID wäre der Maschinenname? (nicht streiten ... nur fragen)
John Cruz
8
Dies gilt nur für v1-Guids, die MAC-Adressen (nicht den Computernamen) als Teil der GUID-Generierung verwenden. Die v4, die de facto STD, verwendet keine Mac-Adressen mehr, sondern eine Pseudozufallszahl.
Xander
14
Guid.NewGuidgeneriert immer v4-GUIDs (und hat es immer getan). Tim muss extrem schlechte Entropiequellen gehabt haben.
Stephen Cleary
1
Wurde das jemals wiederholt? Das ist ein großes Problem, wenn es der Fall ist.
Zyo
1
Gleiches hier beim Importieren sehr großer Datensätze. Von ungefähr 10-100 Millionen erhalten Sie Duplikate von Guid.NewGuid
Stephan Baltzer
28

Ja, eine GUID sollte immer eindeutig sein. Es basiert sowohl auf Hardware als auch auf Zeit und ein paar zusätzlichen Bits, um sicherzustellen, dass es einzigartig ist. Ich bin sicher, dass es theoretisch möglich ist, zwei identische zu erhalten, aber in einem realen Szenario äußerst unwahrscheinlich.

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

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

Eric Z Bart
quelle
5
Dieser Artikel ist ziemlich alt und bezieht sich auf Version 1 der GUIDs. v4 verwendet stattdessen keine Hardware / Zeit, sondern einen Zufallszahlenalgorithmus. en.wikipedia.org/wiki/Globally_unique_identifier#Algorithm
Mani Gandham
Dieser Link ist defekt
Marcel
Hier ist der Link: devblogs.microsoft.com/oldnewthing/20080627-00/?p=21823
Olanrewaju O. Joseph
23

Guids sind statistisch eindeutig. Die Wahrscheinlichkeit, dass zwei verschiedene Clients dieselbe Guid generieren, ist unendlich gering (vorausgesetzt, es gibt keine Fehler im Guid-Generierungscode). Sie können sich auch Sorgen machen, dass Ihr Prozessor aufgrund einer kosmischen Strahlung ausfällt und heute 2 + 2 = 5 entscheidet.

Mehrere Threads, die neue Guids zuweisen, erhalten eindeutige Werte. Sie sollten jedoch feststellen, dass die von Ihnen aufgerufene Funktion threadsicher ist. In welcher Umgebung ist das?

Rob Walker
quelle
19

Eric Lippert hat eine sehr interessante Artikelserie über GUIDs geschrieben.

Es gibt in der Größenordnung von 2 30 PCs auf der Welt (und natürlich viele Handheld-Geräte oder Nicht-PC-Computergeräte, die mehr oder weniger die gleiche Rechenleistung haben, aber wir können diese ignorieren). Nehmen wir an, wir stellen all diese PCs der Welt vor die Aufgabe, GUIDs zu generieren. Wenn jeder beispielsweise 2 20 GUIDs pro Sekunde erzeugen kann, haben Sie nach nur etwa 2 72 Sekunden - 150 Billionen Jahre - eine sehr hohe Wahrscheinlichkeit, eine Kollision mit Ihrer spezifischen GUID zu erzeugen. Und die Wahrscheinlichkeit einer Kollision wird nach nur dreißig Billionen Jahren ziemlich gut.

Paolo Moretti
quelle
28
... und er fährt im nächsten Absatz fort: "Aber das ist eine Kollision mit einer bestimmten GUID. [...] Wenn wir also diese Milliarden PCs einsetzen, um GUIDs mit 122-Bit-Zufälligkeit zu generieren, ist die Wahrscheinlichkeit, dass Zwei von ihnen irgendwo dort drinnen würden sehr hoch kollidieren, nachdem ungefähr 2 ^ 61 GUIDs generiert wurden. Da wir davon ausgehen, dass ungefähr 2 ^ 30 Maschinen 2 ^ 20 GUIDs pro Sekunde ausführen, würden wir nach ungefähr 2 ^ eine Kollision erwarten 11 Sekunden, das ist ungefähr eine Stunde . " (Und schließlich erklärt er, dass natürlich nicht so viele GUIDs generiert werden.)
Arjan
16

Theoretisch sind sie nicht eindeutig. Es ist möglich, immer wieder eine identische Guid zu generieren. Die Wahrscheinlichkeit, dass dies geschieht, ist jedoch so gering, dass Sie davon ausgehen können, dass sie einzigartig sind.

Ich habe zuvor gelesen, dass die Chancen so gering sind, dass Sie sich wirklich über etwas anderes Gedanken machen sollten - wie über das spontane Verbrennen Ihres Servers oder andere Fehler in Ihrem Code. Nehmen Sie also an, es ist einzigartig und bauen Sie keinen Code ein, um Duplikate zu "fangen" - verbringen Sie Ihre Zeit mit etwas, das wahrscheinlicher ist (dh mit irgendetwas anderem).

Ich habe versucht , meinem Blog-Publikum (nicht-technische Familienmitglieder) die Nützlichkeit von GUIDs zu beschreiben. Von dort (über Wikipedia) die Wahrscheinlichkeit, eine doppelte GUID zu generieren:

  • 1 in 2 ^ 128
  • 1 in 340 Undecillion (keine Sorge, Undecillion ist nicht im Quiz)
  • 1 in 3,4 × 10 ^ 38
  • 1 in 340.000.000.000.000.000.000.000.000.000.000.000.000.000
Michael Haren
quelle
1
Eigentlich bin ich nicht der Meinung, dass ich mir keine Sorgen machen muss, wenn auch aus einer anderen Perspektive: Wenn Sie eine GUID-Kollision feststellen, ist bei Ihrer Anwendung ein Fehler aufgetreten. Ich habe GUIDs zum Beispiel für Idempotenz verwendet und habe eine Kollision erhalten, wenn ein Befehl zweimal gesendet wurde (mit derselben GUID).
Kenny Hung
9

Keiner scheint die tatsächliche Mathematik der Wahrscheinlichkeit des Auftretens zu erwähnen.

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

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

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

Da 2 128 viel viel größer ist als n, können wir dies wie folgt approximieren:

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

Und weil wir davon ausgehen können, dass nes viel viel größer als 0 ist, können wir dies auf Folgendes approximieren:

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

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

(1-1 / 2 128 ) n ^ 2/2 = 0,01

Was wir lösen nund bekommen:

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

Welcher Wolfram Alpha wird 5.598318 × 10 19

Um diese Zahl ins rechte Licht zu rücken, nehmen wir 10000 Maschinen mit jeweils einer 4-Kern-CPU, 4 GHz und 10000 Zyklen, um eine Guid zu generieren und nichts anderes zu tun. Es würde dann ~ 111 Jahre dauern, bis sie ein Duplikat erzeugen.

Cine
quelle
Ich habe Ihren Beitrag nach diesem Beitrag bearbeitet - bitte bearbeiten Sie, wenn ich einen Fehler gemacht habe;).
shA.t
Hallo @Cine, ich habe die Möglichkeit, Ihre Antwort zu bearbeiten, habe mich jedoch dagegen entschieden, da ich Ihnen die Möglichkeit geben möchte, sie zuerst zu widerlegen. Ich werde wahrscheinlich in einem Monat vorbeikommen, um sie offiziell zu ändern, wenn ich sie nicht tue. Ich höre nicht von dir. Ich bin mir ziemlich sicher, dass deine Mathematik falsch ist. Die reale Gleichung zur Bestimmung einer 1% igen Chance lautet: ((2 ^ 128 - 1) / 2 ^ 128) ^ ((n (n-1)) / 2) = 0,01. Ihr Exponent ist falsch. es ist nicht nur n. Sie benötigen C (n, 2) (auch bekannt als (n * (n-1)) / 2), um alle Kombinationen zu berechnen, wenn Sie "n" Guids generieren. Siehe hier für weitere Informationen
Viggity
Danke Cine, auch ich habe mich ungefähr n ^
2/2
Es würde 10000 Maschinen 111 Jahre dauern, um jede einzelne mögliche GUID zu generieren und dann ein Duplikat zu generieren. Ein Duplikat würde jedoch lange bevor alle möglichen GUIDs generiert wurden, auftreten. Ich denke, der ungefähre Zeitrahmen würde davon abhängen, wie zufällig der GUID-Generierungsprozess ist.
George K
@GeorgeK Ich denke, Sie haben es falsch verstanden ... Es würde 10000 Maschinen 111 Jahre dauern, bis eine 1% ige Chance besteht, auf ein Duplikat zu stoßen. Aber ja, diese Mathematik geht natürlich davon aus, dass der Zufallsgenerator völlig zufällig ist.
Cine
7

Von http://www.guidgenerator.com/online-guid-generator.aspx

Was ist eine GUID?

GUID (oder UUID) ist eine Abkürzung für "Global Unique Identifier" (oder "Universally Unique Identifier"). Es ist eine 128-Bit-Ganzzahl, mit der Ressourcen identifiziert werden. Der Begriff GUID wird im Allgemeinen von Entwicklern verwendet, die mit Microsoft-Technologien arbeiten, während UUID überall verwendet wird.

Wie einzigartig ist eine GUID?

128 Bit sind groß genug und der Generierungsalgorithmus ist so einzigartig, dass bei einer Generierung von 1.000.000.000 GUIDs pro Sekunde für 1 Jahr die Wahrscheinlichkeit eines Duplikats nur 50% beträgt. Oder wenn jeder Mensch auf der Erde 600.000.000 GUIDs generieren würde, gäbe es nur eine 50% ige Wahrscheinlichkeit für ein Duplikat.

Tono Nam
quelle
7
Ist eine 50% ige Chance auf ein Duplikat nicht hoch genug, um Angst zu verursachen?
Disklosr
1
@disklosr Ja, es reicht aus, Angst zu verursachen, wenn Ihre Systeme 1 Milliarde GUIDs pro Sekunde generieren. In dem äußerst unwahrscheinlichen Fall, dass Sie diesen Betrag generieren,
verketten
5

Ich habe eine doppelte GUID erlebt.

Ich verwende den Desktop-Scanner Neat Receipts und er wird mit einer proprietären Datenbanksoftware geliefert. Die Software verfügt über eine Funktion zur Synchronisierung mit der Cloud, und beim Synchronisieren wurde immer wieder ein Fehler angezeigt. Ein Blick auf die Protokolle enthüllte die großartige Linie:

"Fehler": [{"Code": 1, "Nachricht": "Creator_guid: ist bereits vergeben", "Guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

Ich war ein bisschen ungläubig, aber als ich einen Weg in meine lokale Ordnungsdatenbank fand und den Datensatz mit dieser GUID löschte, trat der Fehler auf.

Um Ihre Frage mit anekdotischen Beweisen zu beantworten, nein. Ein Duplikat ist möglich. Es ist jedoch wahrscheinlich, dass der Grund dafür nicht zufällig war, sondern dass die Standardpraxis in irgendeiner Weise nicht eingehalten wurde. (Ich bin einfach nicht so glücklich) Allerdings kann ich nicht sicher sagen. Es ist nicht meine Software.

Der Kundensupport war EXTREM höflich und hilfsbereit, aber sie müssen noch nie auf dieses Problem gestoßen sein, da sie nach mehr als 3 Stunden Telefonieren mit ihnen keine Lösung gefunden haben. (FWIW, ich bin sehr beeindruckt von Neat, und diese Panne, so frustrierend sie auch sein mag, hat meine Meinung zu ihrem Produkt nicht geändert.)

exintrovertiert
quelle
19
Glaube nicht, dass du ein Duplikat hast. Es handelte sich wahrscheinlich um etwas anderes, z. B. war die Anzahl nicht wirklich zufällig oder ein Problem beim Synchronisierungsprozess oder das System versuchte zweimal aufzuzeichnen usw. Ein Softwareproblem ist viel wahrscheinlicher, als wenn Sie eine doppelte GUID erhalten.
Orad
4

MSDN :

Es besteht eine sehr geringe Wahrscheinlichkeit, dass der Wert der neuen Guid alle Nullen oder gleich einer anderen Guid ist.

Jakub Šturc
quelle
4

Wenn Ihre Systemuhr richtig eingestellt und nicht umwickelt ist und wenn Ihre Netzwerkkarte über einen eigenen MAC verfügt (dh Sie haben keinen benutzerdefinierten MAC festgelegt) und Ihr Netzwerkkartenanbieter keine MACs recycelt hat (was nicht vorgesehen ist) (was bekanntermaßen auftritt), und wenn die GUID-Generierungsfunktion Ihres Systems ordnungsgemäß implementiert ist, generiert Ihr System niemals doppelte GUIDs.

Wenn jeder auf der Erde, der GUIDs generiert, diese Regeln befolgt, sind Ihre GUIDs global eindeutig.

In der Praxis ist die Anzahl der Personen, die gegen die Regeln verstoßen, gering, und es ist unwahrscheinlich, dass ihre GUIDs "entkommen". Konflikte sind statistisch unwahrscheinlich.

DrPizza
quelle
11
Dies gilt nur für v1-Guids. Die v4, die de facto STD, verwendet keine Mac-Adressen mehr, sondern eine Pseudozufallszahl.
Pita.O
1
"Dann generiert Ihr System niemals doppelte GUIDs." Selbst wenn alle Regeln für eine v1-Richtlinie befolgt würden, wie Sie sagen, könnte Ihr System dennoch doppelte generieren. Sie sind unten korrekter, wenn Sie angeben, dass Konflikte statistisch unwahrscheinlich sind.
Nick Meldrum
3

Ist eine GUID 100% der Zeit eindeutig?

Nicht garantiert, da es mehrere Möglichkeiten gibt, eine zu generieren. Sie können jedoch versuchen, die Wahrscheinlichkeit zu berechnen, dass zwei identische GUIDs erstellt werden, und Sie erhalten die Idee: Eine GUID hat 128 Bit, daher gibt es 2 128 verschiedene GUIDs - viel mehr als es Sterne im bekannten Universum gibt. Lesen Sie den Wikipedia-Artikel für weitere Details.

Konrad Rudolph
quelle
2

Im allgemeineren Sinne ist dies als "Geburtstagsproblem" oder "Geburtstagsparadoxon" bekannt. Wikipedia hat einen ziemlich guten Überblick unter: Wikipedia - Geburtstagsproblem

In sehr groben Worten ist die Quadratwurzel der Größe des Pools eine grobe Annäherung an den Zeitpunkt, an dem Sie eine 50% ige Chance auf ein Duplikat erwarten können. Der Artikel enthält eine Wahrscheinlichkeitstabelle mit Poolgröße und verschiedenen Wahrscheinlichkeiten, einschließlich einer Zeile für 2 ^ 128. Bei einer Kollisionswahrscheinlichkeit von 1% würden Sie also erwarten, zufällig 2,6 * 10 ^ 18 128-Bit-Zahlen auszuwählen. Eine 50% ige Chance erfordert 2,2 * 10 ^ 19 Picks, während SQRT (2 ^ 128) 1,8 * 10 ^ 19 beträgt.

Das ist natürlich nur der Idealfall eines wirklich zufälligen Prozesses. Wie andere bereits erwähnt haben, hängt viel von diesem zufälligen Aspekt ab - wie gut sind der Generator und das Saatgut? Es wäre schön, wenn es Hardware-Unterstützung für diesen Prozess gäbe, die kugelsicherer wäre, außer dass alles gefälscht oder virtualisiert werden kann. Ich vermute, dass dies der Grund sein könnte, warum MAC-Adressen / Zeitstempel nicht mehr enthalten sind.

mszil
quelle
Ich denke, das MAC-Problem war die Anonymität. Ich glaube, dass die Verwendung einer Kennung wie einer MAC-Adresse in einer Weise, die umgekehrt werden könnte, ein Datenschutzproblem war. Ich glaube, wahrer Zufall in der Hardware ist sehr schwierig? Cloudflare verwendet eine Kamera und eine Reihe von Lavalampen, aber ich denke, dass mit einem genauen Verständnis der Physik auch das nicht zufällig ist? Cloudflares Lavalampe RNG: popularmechanics.com/technology/security/news/a28921/…
Jeff Block
2

Für ein besseres Ergebnis ist es am besten, die GUID mit dem Zeitstempel zu versehen (nur um sicherzustellen, dass sie eindeutig bleibt).

Guid.NewGuid().ToString() + DateTime.Now.ToString();
Adithya Sai
quelle
Was ist, wenn Sie zwei Kollisionen in derselben Sekunde bekommen?
Wai Ha Lee
Das ist der schlimmste Fall, aber wir können nicht die gleichen zwei Guids gleichzeitig generieren lassen.
Adithya Sai
Irgendwo argumentieren sie, dass man von der Antwort auf SO kopieren sollte, nicht von der Frage, aber ich bin mir jetzt nicht so sicher ...
Marcel
Wie wäre es mit Guid.NewGuid (). ToString (). Replace ("-", "") + DateTime.Now.Ticks .... Nicht fraglich über die Eindeutigkeit und kann als Primärschlüssel verwendet werden
d-Codierer vor
1

GUID-Algorithmen werden normalerweise gemäß der v4-GUID-Spezifikation implementiert, bei der es sich im Wesentlichen um eine Pseudozufallszeichenfolge handelt. Leider fallen diese in die Kategorie "wahrscheinlich nicht eindeutig" von Wikipedia (ich weiß nicht, warum so viele Leute dieses Bit ignorieren): "... andere GUID-Versionen haben unterschiedliche Eindeutigkeitseigenschaften und -wahrscheinlichkeiten, die von garantierter Eindeutigkeit reichen zur wahrscheinlichen Nicht-Einzigartigkeit. "

Die pseudozufälligen Eigenschaften von Math.random()V8s JavaScript sind in ihrer Einzigartigkeit SCHRECKLICH. Kollisionen treten häufig bereits nach wenigen tausend Iterationen auf, aber V8 ist nicht der einzige Schuldige. Ich habe reale GUID-Kollisionen mit PHP- und Ruby-Implementierungen von v4-GUIDs gesehen.

Da die Skalierung der ID-Generierung über mehrere Clients und Cluster von Servern hinweg immer häufiger vorkommt, ist die Entropie von großer Bedeutung - die Wahrscheinlichkeit, dass derselbe zufällige Startwert zum Generieren einer ID verwendet wird, steigt (Zeit wird häufig als zufälliger Startwert verwendet) in Pseudozufallsgeneratoren) und GUID-Kollisionen eskalieren von "wahrscheinlich nicht eindeutig" zu "sehr wahrscheinlich, dass sie viele Probleme verursachen".

Um dieses Problem zu lösen, habe ich mich vorgenommen, einen ID-Algorithmus zu erstellen, der sicher skaliert und bessere Garantien gegen Kollisionen bietet. Dazu werden der Zeitstempel, ein speicherinterner Clientzähler, ein Clientfingerabdruck und zufällige Zeichen verwendet. Die Kombination von Faktoren erzeugt eine additive Komplexität, die besonders widerstandsfähig gegen Kollisionen ist, selbst wenn Sie sie auf mehrere Hosts skalieren:

http://usecuid.org/

Eric Elliott
quelle
1

Ich habe festgestellt, dass die GUIDs beim Testen von Einheiten mit mehreren Threads / Prozessen nicht eindeutig sind (auch?). Ich denke, das hat damit zu tun, dass alle anderen Töne gleich sind und dass Pseudozufallsgeneratoren identisch ausgesät werden (oder nicht ausgesät werden). Ich habe es verwendet, um eindeutige Dateinamen zu generieren. Ich fand, dass das Betriebssystem das viel besser kann :)

Trolling-Alarm

Sie fragen, ob GUIDs 100% eindeutig sind. Das hängt von der Anzahl der GUIDs ab, unter denen es eindeutig sein muss. Wenn sich die Anzahl der GUIDs der Unendlichkeit nähert, nähert sich die Wahrscheinlichkeit für doppelte GUIDs 100%.

Robert Jørgensgaard Engdahl
quelle
1

Die Antwort von "Ist eine GUID 100% eindeutig?" ist einfach "Nein" .

  • Wenn Sie eine 100% ige Eindeutigkeit der GUID wünschen, gehen Sie wie folgt vor.

    1. GUID generieren
    2. Überprüfen Sie, ob diese GUID in Ihrer Tabellenspalte vorhanden ist, in der Sie nach Eindeutigkeit suchen
    3. Wenn vorhanden, gehe zu Schritt 1, sonst zu Schritt 4
    4. Verwenden Sie diese GUID als eindeutig.
Baba Khedkar
quelle
Dies macht es nicht einzigartig. Ihr Algorithmus speichert die neu erstellte GUID nicht in der Tabelle. Wenn Sie das nächste Mal eine GUID erstellen, kann diese mit einer zuvor kollidieren. Wenn Sie die GUID in die Tabelle einfügen, wurde die GUID möglicherweise bereits von einem anderen Peer eingefügt, zwischen dem Sie die Eindeutigkeit überprüft und die GUID in die Tabelle eingefügt haben. Die GUID ist nur innerhalb IHRES Systems eindeutig. Wenn Sie also zwei Datenbanken importieren oder zusammenführen, können diese dennoch kollidieren. GUIDs werden häufig verwendet, wenn Sie keinen Zugriff auf eine zentrierte Datenbank haben. Wenn Sie hatten, warum nicht einfach eine ID aus der Datenbank ziehen?
Jogge
0

Der schwierigste Teil besteht nicht darin, eine doppelte Guid zu erstellen.

Der schwierigste Teil ist eine Datenbank, in der alle generierten Daten gespeichert werden, um zu überprüfen, ob sie tatsächlich dupliziert wurden.

Von WIKI:

Zum Beispiel beträgt die Anzahl der zufälligen UUIDs der Version 4, die generiert werden müssen, um eine 50% ige Wahrscheinlichkeit für mindestens eine Kollision zu haben, 2,71 Billionen, berechnet wie folgt:

Geben Sie hier die Bildbeschreibung ein

Diese Zahl entspricht einer Generierung von 1 Milliarde UUIDs pro Sekunde für ungefähr 85 Jahre, und eine Datei mit diesen vielen UUIDs mit 16 Bytes pro UUID würde ungefähr 45 Exabyte groß sein, ein Vielfaches größer als die größten derzeit existierenden Datenbanken die Größenordnung von Hunderten von Petabyte

Trong Hiep Le
quelle
0

GUID steht für Global Unique Identifier

In Kürze: (der Hinweis ist im Namen)

Im Detail: GUIDs sind einzigartig gestaltet. Sie werden nach einer zufälligen Methode berechnet, die auf der Uhr des Computers und dem Computer selbst basiert. Wenn Sie viele GUIDs in derselben Millisekunde auf demselben Computer erstellen, ist es möglich, dass sie übereinstimmen, aber für fast alle normalen Vorgänge sollten sie als eindeutig betrachtet werden.

Benjamin Roberts
quelle