Gibt es Nachteile bei der Suche nach eindeutigen IDs für Daten auf die Funktion System.Guid.NewGuid ()?

8

Ich möchte eindeutige IDs für die Identifizierung einiger Daten in meinem System generieren. Ich verwende ein ausgeklügeltes System, das einige (nicht eindeutige, relevante) Metadaten mit System.Guid.NewGuid () s verknüpft. Gibt es irgendwelche Nachteile bei diesem Ansatz, oder bin ich klar?

    
blueberryfields 18.04.2012, 20:32
quelle

3 Antworten

15
  

Ich möchte eindeutige IDs für die Identifizierung einiger Daten in meinem System generieren.

Ich würde dann eine GUID empfehlen, da sie definitionsgemäß global eindeutige Bezeichner sind.

  

Ich verwende ein ausgeklügeltes System, das einige (nicht eindeutige, relevante) Metadaten mit System.Guid.NewGuid () verknüpft. Gibt es irgendwelche Nachteile bei diesem Ansatz, oder bin ich klar?

Nun, da wir nicht wissen, was Sie als Nachteil betrachten würden, ist es schwer zu sagen. Es gibt eine Reihe von möglichen Nachteilen:

  • GUIDs sind groß: 128 Bits sind viele Bits.

  • Für GUIDs ist keine bestimmte Verteilung garantiert. Es ist vollkommen legal, dass GUIDs sequenziell erzeugt werden, und es ist vollkommen legal, dass sie gleichmäßig über ihren 124-Bit-Bereich verteilt sind (128 Bits minus die vier Bits, die natürlich die Versionsnummer sind). Dies kann schwerwiegende Auswirkungen auf die Datenbank haben Leistung, wenn die GUID als Primärschlüssel für eine Datenbank verwendet wird, die von der GUID in sortierte Reihenfolge indiziert wird; Einfügungen sind viel effizienter, wenn die neue Zeile immer am Ende geht. Eine gleichmäßig verteilte GUID wird am Ende fast nie sein.

  • Version 4 GUIDs sind pseudozufällig, aber nicht kryptographisch zufällig; Ein Angreifer könnte theoretisch vorhersagen, was Ihre GUIDs sind, wenn sie eine repräsentative Stichprobe von ihnen erhalten. Ein Angreifer könnte theoretisch die Wahrscheinlichkeit ermitteln, dass zwei GUIDs in derselben Sitzung generiert wurden. GUIDs der ersten Version sind natürlich kaum zufällig und können dem anspruchsvollen Leser sagen, wann und wo sie generiert wurden.

  • Und so weiter.

Ich plane in den nächsten Wochen eine Reihe von Artikeln über diese und andere Eigenschaften von GUIDs; schaue auf meinen Blog für Details.

    
Eric Lippert 18.04.2012, 21:40
quelle
7

Wenn Sie System.Guid.NewGuid() verwenden, möchten Sie möglicherweise überprüfen, ob die GUID in Ihrem System bereits existiert.

Während eine GUID so komplex ist, dass sie praktisch einzigartig ist, gibt es keine Garantie dafür, dass sie nicht bereits existiert, mit Ausnahme der Wahrscheinlichkeit. Es ist nur unglaublich unwahrscheinlich, bis zu dem Punkt, dass es in fast jedem Fall dasselbe ist wie einzigartig.

Die Generierung zu identischen Lernzielen ist wie zweimaliges Lottogewinn - es gibt nichts, was das verhindern könnte, es ist so unwahrscheinlich, dass es genauso gut unmöglich ist.

In den meisten Fällen könnte es passieren, dass Sie nicht nach vorhandenen Übereinstimmungen suchen, aber in einem sehr extremen Fall, in dem viele Generationen laufen oder das System absolut nicht fehlschlagen könnte lohnt sich zu überprüfen.

BEARBEITEN

Lassen Sie mich ein wenig mehr klären. Es ist sehr, sehr unwahrscheinlich, dass Sie jemals eine doppelte Guid sehen würden. Das ist der Punkt. Es ist "global einzigartig", was bedeutet, dass es eine so winzige Chance auf ein Duplikat gibt, dass Sie davon ausgehen können, dass es einzigartig sein wird. Wenn wir jedoch über Code sprechen, der ein Flugzeug in den Himmel hält, einen Atomreaktor überwacht oder die Lebenserhaltung auf der Internationalen Raumstation übernimmt, würde ich persönlich immer noch nach einem Duplikat suchen, nur weil es wirklich schrecklich wäre treffe diesen Randfall. Wenn Sie nur eine Blog-Engine schreiben, gehen Sie dagegen vor, verwenden Sie sie ohne zu überprüfen.

    
SouthShoreAK 18.04.2012 20:37
quelle
5

Fühlen Sie sich frei, NewGuid() zu verwenden. Es gibt kein Problem mit seiner Einzigartigkeit.

Es gibt eine zu geringe Wahrscheinlichkeit, dass dieselbe GUID zweimal generiert wird. Ein schönes Beispiel finden Sie hier: Einfacher Beweis, dass GUID nicht eindeutig ist

%Vor%

Irgendwann ist es bei OutOfMemory und nicht bei doppeltem Schlüsselkonflikt abgestürzt.

    
Tigran 18.04.2012 20:42
quelle

Tags und Links