Ich arbeite an einer Datenbank in SQL Server 2000, die eine GUID für jeden Benutzer verwendet, der die App verwendet, an die er gebunden ist. Irgendwie hatten zwei Benutzer dieselbe GUID. Ich weiß, dass Microsoft einen Algorithmus verwendet, um eine zufällige GUID zu generieren, die eine äußerst geringe Wahrscheinlichkeit hat, Kollisionen zu verursachen. Ist eine Kollision dennoch möglich?
sql-server
guid
Jason Baker
quelle
quelle
Antworten:
Grundsätzlich nein. Ich glaube, jemand hat sich mit Ihrer Datenbank beschäftigt. Abhängig von der von Ihnen verwendeten Versions-GUID ist der Wert entweder eindeutig (für GUIDs der Version 1) oder sowohl eindeutig als auch unvorhersehbar (für GUIDs der Version 4). Die Implementierung von SQL Server für die Funktion NEWID () scheint eine 128-Bit-Zufallszahl zu verwenden, sodass keine Kollision auftritt.
Für eine Kollisionswahrscheinlichkeit von 1% müssten Sie ungefähr 2.600.000.000.000.000.000 GUIDs generieren .
quelle
Grundsätzlich sind sie nicht möglich! sind die Chancen astronomisch gering .
Aber ... ich bin die einzige Person auf der Welt, die ich kenne und die einmal eine GUID-Kollision hatte (yep!).
Und ich bin mir sicher, dass es kein Fehler war.
Wie kam es, dass in einer kleinen Anwendung, die auf einem Pocket PC ausgeführt wurde, am Ende eines Vorgangs ein Befehl mit einer generierten GUID ausgegeben werden muss? Der Befehl wurde nach seiner Ausführung auf dem Server zusammen mit dem Ausführungsdatum in einer Befehlstabelle auf dem Server gespeichert. Eines Tages, als ich debuggte, gab ich den Modulbefehl aus (mit der neu generierten GUID) und nichts passierte. Ich habe es erneut getan (mit derselben Guid, da die Guid zu Beginn der Operation nur einmal generiert wurde) und erneut und nichts, um schließlich herauszufinden, warum der Befehl nicht ausgeführt wird, habe ich die Befehlstabelle überprüft. und die gleiche GUID wie die aktuelle wurde vor 3 Wochen eingefügt. Da ich das nicht glaubte, stellte ich eine Datenbank aus einer zweiwöchigen Sicherung wieder her, und die Anleitung war da. Überprüfte den Code, der neue Guid wurde ohne Zweifel frisch generiert.
Bearbeiten: Es gibt einige Faktoren, die die Wahrscheinlichkeit, dass dies geschieht, erheblich erhöht haben könnten. Die Anwendung wurde auf dem PocketPC-Emulator ausgeführt, und der Emulator verfügt über eine Funktion zum Speichern des Status. Dies bedeutet, dass bei jeder Wiederherstellung des Status auch die Ortszeit wiederhergestellt wird und die Guid basiert auf dem internen Timer .... auch der Guid-Generierungsalgorithmus für ein kompaktes Framework ist möglicherweise weniger vollständig als zum Beispiel der COM-Algorithmus ...
quelle
Sie sind theoretisch möglich, aber mit 3.4E38 möglichen Zahlen beträgt die Wahrscheinlichkeit, ein Duplikat zu erhalten, 0,00000000006 ( Quelle ) , wenn Sie in einem Jahr mehrere zehn Billionen GUIDs erstellen .
Wenn zwei Benutzer dieselbe GUID hätten, würde ich wetten, dass das Programm einen Fehler enthält, der dazu führt, dass die Daten kopiert oder gemeinsam genutzt werden.
quelle
Betrachten wir zunächst die Wahrscheinlichkeit einer Kollision zweier GUIDs. Wie aus anderen Antworten hervorgeht, ist es aufgrund des Geburtstagsparadoxons nicht 1 zu 2 ^ 128 (10 ^ 38) , was bedeutet, dass bei einer 50% igen Wahrscheinlichkeit, dass zwei GUIDs kollidieren, die Wahrscheinlichkeit tatsächlich 1 zu 2 ^ 64 (10 ^) beträgt 19) was viel kleiner ist. Dies ist jedoch immer noch eine sehr große Zahl, und daher ist die Wahrscheinlichkeit einer Kollision unter der Annahme, dass Sie eine angemessene Anzahl von GUIDs verwenden, gering.
Beachten Sie auch, dass GUIDs keinen Zeitstempel oder die MAC-Adresse enthalten, wie viele Leute auch zu glauben scheinen. Dies galt für v1-GUIDs, aber jetzt werden v4-GUIDs verwendet, bei denen es sich einfach um eine Pseudozufallszahl handelt. Dies bedeutet, dass die Wahrscheinlichkeit einer Kollision wahrscheinlich höher ist, da sie nicht mehr nur für eine Zeit und eine Maschine gelten.
Die Antwort lautet also im Wesentlichen: Ja, Kollisionen sind möglich. Aber sie sind höchst unwahrscheinlich.
Bearbeiten: behoben, um 2 ^ 64 zu sagen
quelle
1 in 10^64 (10^19)
dem ich denke, dass er sein sollte1 in 2^64 (10^19)
. Ich bin auch sehr verwirrt, wie Sie denken, dass das Geburtstagsparadoxon nur für 2 Zahlen gilt. Ich nehme an, Sie haben sich en.wikipedia.org/wiki/Birthday_paradox angesehen . Die Tabelle zeigt, wie viele Hilfslinien Sie für eine bestimmte Wahrscheinlichkeit eines Duplikats benötigen. Aus dieser Tabelle ergibt eine Wahrscheinlichkeit von 1 zu 10 ^ 18 2,6 * 10 ^ 10 Guids, nicht etwas, das nur zwei GUIDs nahe kommt.Die Wahrscheinlichkeit, dass zwei zufällige GUIDs kollidieren (~ 1 in 10 ^ 38), ist geringer als die Wahrscheinlichkeit, dass ein beschädigtes TCP / IP-Paket nicht erkannt wird (~ 1 in 10 ^ 10). http://wwwse.inf.tu-dresden.de/data/courses/SE1/SE1-2004-lec12.pdf , Seite 11. Dies gilt auch für Festplatten, CD-Laufwerke usw.
GUIDs sind statistisch eindeutig und die Daten, die Sie aus der Datenbank lesen, sind nur statistisch korrekt.
quelle
Ich würde Occams Rasiermesser in diesem Fall als guten Leitfaden betrachten. Es ist unglaublich unwahrscheinlich, dass Sie eine GUID-Kollision haben. Es ist viel wahrscheinlicher, dass Sie einen Fehler haben oder dass jemand mit Ihren Daten herumspielt.
quelle
Siehe den Artikel " Globally Unique Identifier" von Wikipedia . Es gibt verschiedene Möglichkeiten, GUIDs zu generieren. Anscheinend verwendete die alte (?) Methode die Mac-Adresse, einen Zeitstempel bis zu einer sehr kurzen Einheit und einen eindeutigen Zähler (um schnelle Generationen auf demselben Computer zu verwalten), sodass es nahezu unmöglich ist, sie zu duplizieren. Diese GUIDs wurden jedoch gelöscht, da sie zum Aufspüren von Benutzern verwendet werden konnten ...
Ich bin mir nicht sicher, welchen neuen Algorithmus Microsoft verwendet (der Artikel besagt, dass eine Folge von GUIDs vorhergesagt werden kann, dass sie keinen Zeitstempel mehr verwenden? Der oben verlinkte Microsoft-Artikel sagt etwas anderes ...).
Jetzt sind GUIDs sorgfältig so konzipiert, dass sie namentlich global einzigartig sind. Ich gehe also das Risiko ein, dass dies unmöglich ist oder mit sehr, sehr geringer Wahrscheinlichkeit. Ich würde woanders suchen.
quelle
Zwei Win95-Computer mit Ethernet-Karten mit doppelten MAC-Adressen geben unter streng kontrollierten Bedingungen doppelte GUIDS aus, insbesondere wenn beispielsweise die Stromversorgung im Gebäude unterbrochen wird und beide genau zur gleichen Zeit starten.
quelle
Ich werde dies mit "Ich bin keine Networking-Person, daher kann ich völlig inkohärente Sätze machen, die folgen" vorwegnehmen.
Als ich an der Illinois State University arbeitete, hatten wir zwei Dell-Desktops, die zu unterschiedlichen Zeiten bestellt wurden. Wir haben den ersten in das Netzwerk aufgenommen, aber als wir versuchten, den zweiten in das Netzwerk aufzunehmen, erhielten wir verrückte Fehler. Nach eingehender Fehlerbehebung wurde festgestellt, dass beide Computer dieselbe GUID produzierten (ich weiß nicht genau, wofür, aber beide waren im Netzwerk unbrauchbar). Dell ersetzte tatsächlich beide Maschinen als defekt.
quelle
Ich weiß, dass Leute die Wohlfühlantwort mögen, dass GUIDs magisch und garantiert einzigartig sind, aber in Wirklichkeit sind die meisten GUIDs nur 121-Bit-Zufallszahlen (sieben der Bits werden für die Formatierung verschwendet). Wenn Sie sich mit einer großen Zufallszahl nicht wohl fühlen würden, sollten Sie sich mit einer GUID nicht wohl fühlen.
quelle
Könnte der Code, der zum Generieren einer GUID verwendet wird, einen Fehler enthalten? Ja, natürlich könnte es. Die Antwort ist jedoch die gleiche wie bei einem Compiler-Fehler. Ihr eigener Code ist um Größenordnungen wahrscheinlicher fehlerhaft. Schauen Sie also zuerst dort nach.
quelle
Natürlich ist es möglich ... wahrscheinlich? Nicht wahrscheinlich, aber es ist möglich.
Denken Sie daran, dass dieselbe Maschine jede GUID (den Server) generiert, sodass ein Großteil der "Zufälligkeit", die auf maschinenspezifischen Informationen basiert, verloren geht.
quelle
Versuchen Sie nur zum Grinsen das folgende Skript ... (funktioniert unter SQL 2005, nicht sicher über 2000)
Wenn Sie dies wiederholt ausführen (dauert weniger als eine Sekunde), wird von der ersten Auswahl an ein ziemlich großer Bereich erzeugt, selbst bei einer EXTREM kurzen Zeitlücke. Bisher hat die zweite Auswahl nichts produziert.
quelle
Unmöglich, wenn die Benutzer unterschiedliche Computer mit Netzwerkkarten haben, und selbst wenn nicht, ist dies immer noch ein äußerst geringes, fast theoretisches Risiko.
Persönlich würde ich woanders hinschauen, da es eher ein Fehler als ein GUID-Konflikt ist ...
Vorausgesetzt natürlich, Sie hacken die GUID nicht ab, um sie zu verkürzen.
quelle
Sicher ist es möglich und vielleicht sogar wahrscheinlich. Es ist nicht so, dass sich jede GUID in einem zufälligen Teil des möglichen Zahlenraums befindet. Für den Fall, dass zwei Threads gleichzeitig versuchen, einen zu generieren, könnten sie, abgesehen von einer Art zentraler GUID-Funktion mit einem Semaphor, denselben Wert erhalten.
quelle
Es ist sehr unwahrscheinlich, dass Sie auf GUID-Kollisionen stoßen, wenn Sie diese über die
NEWID()
Funktion in SQL Server generieren (obwohl dies natürlich möglich ist, wie andere Antworten hervorgehoben haben). Eine Sache, auf die sie nicht hingewiesen haben, ist, dass es tatsächlich sehr wahrscheinlich ist, dass Sie auf Kollisionen stoßen, wenn Sie GUIDs in JavaScript in Browsern in freier Wildbahn generieren. Es gibt nicht nur manchmal Probleme im RNG in verschiedenen Browsern, sondern ich bin auch auf Probleme gestoßen, bei denen die Google-Spider die Ergebnisse solcher Funktionen zwischenzuspeichern scheinen und wiederholt dieselbe GUID an unsere Systeme übergeben haben.Weitere Informationen finden Sie in den verschiedenen Antworten hier:
Kollisionen beim Generieren von UUIDs in JavaScript?
quelle