In einem der Projekte, an denen ich arbeite, sieht man ziemlich regelmäßig folgendes Muster:
var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
guid = Guid.NewGuid().ToString();
}
Obwohl ich verstehe, dass eine GUID nicht garantiert eindeutig ist und gemäß der MSDN-Dokumentation eine generierte GUID Null sein kann , ist dies eine praktische Überlegung, die es tatsächlich wert ist, Zyklustests zu senden, sowohl im rechnerischen Sinne als auch in Bezug auf die Entwicklerzeit, die darüber nachdenkt ?
Antworten:
Ich würde vorschlagen, dass es sich nicht lohnt, nach Guid.Empty zu suchen. Die Dokumente für Guid.NewGuid erwähnen das aus irgendeinem Grund
Guid.NewGuid ist ein Wrapper für die Win32-API CoCreateGuid , in dem die Rückgabe aller Nullen nicht erwähnt wird.
Raymond Chen geht noch weiter und schlägt dies vor
Also, nein, ich würde mir darüber keine Sorgen machen. Ich werde nicht erraten, warum die Guid.NewGuid-Dokumente es überhaupt erwähnen.
quelle
Wenn Sie feststellen, dass
Guid.NewGuid() == Guid.Empty
Sie die härteste Lotterie der Welt gewonnen haben. Kümmern Sie sich nicht um Eindeutigkeits- oder Kollisionsprüfungen. Nicht mit zu tun , das ist , was guids sind für . Ich werde dir die Mathematik ersparen, es ist überall im Web.Außerdem haben Windows-Guids immer eine "Ziffer" gleich
4
. Guids haben eine gewisse Struktur.Das von Ihnen gepostete Code-Snippet sieht so aus, als hätte ein Entwickler vergessen, eine
Guid
Variable zu initialisieren , und festgestellt, dass dies der Fall istGuid.Empty
. Er identifizierte fälschlicherweiseGuid.NewGuid()
als die Ursache. Jetzt wird er für immer abergläubisch daran glauben.In jedem Fall ist dies die falsche Frage. Ich bin mir sicher, dass Ihr Code nicht nur vom Zeichnen abhängt,
Guid.Empty
sondern auch von der Eindeutigkeit. Diesewhile
Schleife erzwingt keine Eindeutigkeit. Guids sind dazu da, ohne Koordination einen einzigartigen Wert zu produzieren . Das ist ihr Anwendungsfall.quelle
Schauen Sie sich den Quellcode der
Guid.NewGuid
Methode an :Sehen Sie den Code Vertrag? Die
Guid.NewGuid
Methode liefert niemals eine leere GUID.quelle
Wenn Sie die GUID mit der GUID Null vergleichen möchten, müssen Sie nach der gleichen Logik auch die GUID mit der gebotenen Sorgfalt mit allen anderen GUIDs in Ihrer Anwendung vergleichen (da die Wahrscheinlichkeit, eine Null zu erhalten, mit der Wahrscheinlichkeit von identisch sein sollte Beliebige andere GUID in Ihrer App erhalten *). Sie müssen dies tun, um zu beweisen, dass das Axiom, nach dem Sie handeln, die Eindeutigkeit dieser GUID ist (was eigentlich dasselbe Axiom ist wie das Testen gegen 0).
Offensichtlich ist das absurd.
TLDR;Wenn Sie sich darauf verlassen können, dass NewGuid () eindeutige Ergebnisse liefert, können Sie sich auch darauf verlassen, dass es keine einzige bekannte GUID liefert.
* Es ist eigentlich nicht die gleiche Wahrscheinlichkeit wie .NET-GUIDs passen immer die folgenden
{________-____-4___-____-____________}
sodass NewGuid NIEMALS eine Null-GUID generiertAus Spaß schlug ich hier eine Verbesserung der Dokumentation vor: http://feedback.msdn.com/forums/257782-msdn-feature-suggestions/suggestions/7143498-fix-documentation-for-newguid
quelle