Guid.NewGuid () vs. new Guid ()

346

Was ist der Unterschied zwischen Guid.NewGuid()und new Guid()?

Welches ist bevorzugt?

OscarRyz
quelle
6
@ClintonWard Ich bin praktisch neu in C # und @ Bob2Chiv. Ich kann das Projekt momentan nicht ausführen und war neugierig darauf.
OscarRyz
6
@OscarRyz - Zum schnellen Testen von Code in C # verwende ich LinqPad .
DaveShaw
5
Eigentlich glaube ich, dass diese Frage relevant ist, weil sie verwirrend ist und ich nicht wirklich "0000000-0000 .." als beste Standardeinstellung. Ich bin gerade auf ein Problem gestoßen, bei dem sich ein Client nicht bei einem System anmelden konnte, weil irgendwo tief im Projekt new Guid () anstelle von NewGuid () aufgerufen wurde
Michiel Cornille
3
@ DaveShaw - LinQPad ist großartig und ich benutze es oft. Ich wollte jedoch darauf hinweisen, dass Visual Studio jetzt ein "C # Interactive" -Fenster hat, das für diese Art von Tests sehr nützlich ist.
Mark Meuer
1
@ MichaelCornille Ich habe gerade das Gefühl kennengelernt, Bruder ...
Jins Peter

Antworten:

580

new Guid() macht eine "leere" All-0-Guid (00000000-0000-0000-0000-000000000000 ist nicht sehr nützlich).

Guid.NewGuid() macht eine tatsächliche Guid mit einem einzigartigen Wert, was Sie wahrscheinlich wollen.

MarkPflug
quelle
26
Eine leere UUID ist in der Tat sehr nützlich. Es macht einen großen besonderen Wert.
Jon Hanna
103
Nebenbei bemerkt, new Guid()entspricht Guid.Empty.
Steve Guidi
30
@ JonHanna Alle Guids machen tolle Sonderwerte. Leider neigen die Leeren dazu, zu kollidieren. Ich bin damit einverstanden, dass leere Hilfslinien nützlich sind, um normalerweise anzuzeigen, dass etwas nicht initialisiert ist.
MarkPflug
5
Die leeren sind sehr nützlich, weil sie kollidieren. Ein Sonderwert, der nicht mit dem bekannten Sonderwert kollidiert, wäre nutzlos.
Jon Hanna
5
Ich denke, Sie sind sich beide einig, dass es eine gute "bekannte Anleitung" ist, mit der man vergleichen kann, wie im Fall der Anzeige, dass etwas auf die Initialisierung wartet oder sich in einem anderen bekannten Zustand befindet. Persönlich würde ich es vorziehen, einen Nullwert zu verwenden, aber ich kann sehen, dass jemand irgendwann eine "spezielle" Guid benötigt, und die All-0-Guid ist wahrscheinlich die Guid, die am wenigsten wahrscheinlich gegen das Prinzip der geringsten Überraschung für zukünftige Betreuer verstößt des Codes.
PeterL
37

Guid.NewGuid() Erstellt eine neue UUID mit einem Algorithmus, der Kollisionen sehr, sehr unwahrscheinlich macht.

new Guid() Erstellt eine UUID, die aus Nullen besteht.

Im Allgemeinen würden Sie die erstere bevorzugen, da dies der Punkt einer UUID ist (es sei denn, Sie erhalten sie natürlich von einem anderen Ort).

Es gibt Fälle, in denen Sie zwar eine All-Zero-UUID wünschen, aber in diesem Fall Guid.Emptyoder wenn default(Guid)Ihre Absicht klarer ist und die Wahrscheinlichkeit geringer ist, dass jemand, der sie liest, erwartet, dass ein eindeutiger Wert erstellt wurde.

Alles in allem new Guid()ist das aufgrund dieser Unklarheit nicht nützlich, aber es ist nicht möglich, einen Werttyp zu haben, der keinen parameterlosen Konstruktor hat, der einen Wert für alle Nullen und Nullen zurückgibt.

Bearbeiten: Tatsächlich ist es möglich, einen parameterlosen Konstruktor für einen Werttyp zu haben, der nicht alles auf Null und Null setzt, aber Sie können dies nicht in C # tun und die Regeln darüber, wann und wann es aufgerufen wird Nur eine All-Zero-Struktur zu erstellen, ist verwirrend, daher ist es sowieso keine gute Idee.

Jon Hanna
quelle
16
Ich werde dies zum Spaß hinzufügen. Für eine 1% ige Kollisionswahrscheinlichkeit müssten Sie ungefähr 2.600.000.000.000.000.000 GUIDs generieren
Clinton Ward
8
@ClintonWard hängt davon ab, welcher der UUID-Algorithmen verwendet wird. Da jedoch einige MAC-Adressen verwenden, um Kollisionen zwischen Maschinen zu vermeiden, und alle einen Zeitfaktor verwenden, um Kollisionen auf derselben Maschine zu vermeiden, müssen Sie noch mehr als die normale Mathematik erstellen würde vorschlagen. Es sei denn, Sie schrauben absichtlich mit dem Algorithmus, indem Sie die Zeit ändern und mit MAC-Adressen herumspielen. In diesem Fall sollten Sie ziemlich schnell eine bekommen - aber das ist absichtlich mit den Eingaben durcheinander.
Jon Hanna
2
Das war v1 Guid. Neuere MS-GUIDs sind V4 und verwenden die MAC-Adresse nicht als Teil der GUID-Generierung. Zeit ist immer noch ein Faktor
Clinton Ward
16

[Ich verstehe, dass dies ein alter Thread ist, der nur einige Details hinzufügt] Die beiden Antworten von Mark und Jon Hanna fassen die Unterschiede zusammen, auch wenn es einige davon interessieren könnte

Guid.NewGuid()

Ruft schließlich CoCreateGuid auf (ein COM-Aufruf von Ole32) (Referenz hier ) und die eigentliche Arbeit wird von UuidCreate erledigt .

Guid.Empty soll verwendet werden, um zu überprüfen, ob eine Guid alle Nullen enthält. Dies könnte auch durch Vergleichen des Werts der fraglichen Guid mit der neuen Guid () erfolgen.

Wenn Sie also eine eindeutige Kennung benötigen , lautet die Antwort Guid.NewGuid ()

Sudhanshu Mishra
quelle
-2

Guid.NewGuid(), wie es GUIDs wie beabsichtigt erstellt.

Guid.NewGuid()Erstellt ein leeres GuidObjekt, initialisiert es durch Aufrufen CoCreateGuidund gibt das Objekt zurück.

new Guid() erstellt lediglich eine leere GUID (alle Nullen, denke ich).

Ich denke, sie mussten den Konstruktor so veröffentlichen, wie er Guidist struct.

Sharath
quelle
5
Was bringt es, eine Antwort hinzuzufügen, die nichts hinzufügt, was in Antworten, die seit Jahren hier sind, noch nicht existiert?
Dinerdo