Wie zu Erstellen, die Deterministisch, Guids
In unserer Anwendung, die wir erstellen Xml-Dateien mit einem Attribut, das ein Guid-Wert. Dieser Wert, der benötigt wird, um Einklang zwischen Datei-upgrades. Also, auch wenn alles andere in der Datei ändert, wird der guid-Wert für das Attribut unverändert bleiben sollten.
Eine offensichtliche Lösung war es, ein statisches Wörterbuch mit dem Dateinamen und die Guids werden für Sie verwendet werden. Dann wenn wir die Datei zu erstellen, suchen wir das Wörterbuch für den Dateinamen und verwenden Sie den entsprechenden guid. Aber das ist nicht machbar, da wir vielleicht skalieren zu 100 Dateien und nicht pflegen wollen große Liste von guids.
Also ein anderer Ansatz war, um die Guid der gleichen auf der Grundlage der Pfad der Datei. Seit unserem Datei-Pfade und-Anwendung-Verzeichnis-Struktur sind einzigartig, die Guid muss eindeutig sein, der Pfad. Also jedes mal, wenn wir ein upgrade erhalten haben, erhält die Datei den gleichen guid basierend auf seinem Weg. Ich fand eine Coole Art zu erzeugen solcher 'Deterministische Guids' (Dank Elton Stoneman). Im Grunde bedeutet dies:
private Guid GetDeterministicGuid(string input)
{
//use MD5 hash to get a 16-byte hash of the string:
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
byte[] inputBytes = Encoding.Default.GetBytes(input);
byte[] hashBytes = provider.ComputeHash(inputBytes);
//generate a guid from the hash:
Guid hashGuid = new Guid(hashBytes);
return hashGuid;
}
So erhält eine Zeichenkette, die Guid wird immer die gleiche sein.
Gibt es noch andere Ansätze oder empfohlenen Möglichkeiten, dies zu tun? Was sind die vor-oder Nachteile der Methode?
InformationsquelleAutor Punit Vora | 2010-04-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie erwähnt von @in der Bacar, RFC 4122 §4.3 definiert einen Weg, um erstellen Sie einen name-based UUID. Der Vorteil, dies zu tun (über die nur mit einem MD5-hash) ist, dass diese garantiert nicht zu kollidieren mit nicht-genannt-basiert UUIDs, und haben eine sehr (sehr) kleine Möglichkeit von Kollision mit anderen namensbasierte UUIDs.
Gibt es keine native Unterstützung in der .NET Framework für die Erstellung dieser, aber ich gepostet code auf GitHub implementiert den Algorithmus. Es kann wie folgt verwendet werden:
Reduzieren das Risiko von Kollisionen mit anderen GUIDs sogar noch weiter, Sie konnte erstellen eine private GUID zu verwenden, da die namespace-ID (anstelle des URL-namespace-ID definiert in der RFC).
Ich habe nicht bemerkt,, danke/sorry! Ich sollte immer daran denken, überprüfen Sie die errata beim Lesen von RFC... 🙂
Sie sind herzlich eingeladen/kein problem. Es verwirrt den Verstand, dass Sie nicht aktualisieren Sie die RFC-in-place mit den Korrekturen, die aus der errata. Auch ein link am Ende des Dokuments wäre wesentlich hilfreicher, als sich auf den Leser daran zu erinnern, um die Suche für die errata (hoffentlich bevor schreiben eine Implementierung basierend auf RFC...).
wenn Sie die HTML-version hat es einen link zu den errata aus dem header, z.B. tools.ietf.org/html/rfc4122. Ich Frage mich, ob es eine browser-Erweiterung, um stets eine Weiterleitung auf die HTML-version...
Sie sollten prüfen, trägt dies zu .NET .NETTO-repo ist hier:github.com/dotnet/coreclr/tree/master/src/mscorlib/src/System
InformationsquelleAutor Bradley Grainger
Dieser wandelt jede Zeichenfolge in eine Guid, ohne zu importieren, die außerhalb Montage.
Es gibt viel bessere Möglichkeiten zu generieren, die eine eindeutige Guid, aber dies ist ein Weg, um konsequent aktualisieren eines string-Daten-Taste, um eine Guid-Schlüssel.
Warnung! Dieser code erzeugt keine gültige Guids / UUIDs (wie in der Bacar auch unten erwähnt). Weder die version, noch das type-Feld korrekt gesetzt sind.
Wäre es nicht genauso effektiv in der Anwendung der MD5CryptoServiceProvider-statt den SHA1-Hash, da MD5 bereits 16 Byte Länge?
InformationsquelleAutor Ben Gripka
Als Rob erwähnt, Ihre Methode nicht erzeugen einer UUID, die es erzeugt einen hash, der aussieht wie eine UUID.
Den RFC 4122 auf UUIDs ausdrücklich erlaubt für deterministische (name-based) UUIDs - Versionen 3 und 5 verwenden, md5 und SHA1(jeweils). Die meisten Menschen sind wahrscheinlich vertraut mit der version 4, die ist zufällig. Wikipedia gibt einen guten überblick über die Versionen. (Beachten Sie, dass die Verwendung des Wortes "version" hier scheint zu beschreiben, ein " Typ " der UUID - version 5 nicht über version 4).
Scheint es dort einige Bibliotheken gibt, die für die Erzeugung version 3/5-UUIDs, einschließlich der python-uuid-Modul, boost.uuid (C++) und OSSP UUID. (Ich habe nicht geschaut .net)
In Bezug auf die Verwendung des Wortes "version", RFC 4122 §4.1.3 heißt es: "Die version ist genauer gesagt ein sub-Typ; wieder, wir behalten den Begriff für die Kompatibilität."
Ich erzielte einige C# - code zu erstellen, v3 und v5 GUIDs auf GitHub: github.com/LogosBible/Logos.Utility/blob/master/src/...
Ich bekomme Warnung Bitweisen oder-operator auf ein Vorzeichen erweitert, operand; betrachten Sie umwandeln in einen kleineren unsigned-Typ erste
Das wird langsam off-topic! Schlage vor, das verschieben der einzelnen lib bug-reports auf GitHub.
InformationsquelleAutor bacar
MD5 ist schwach, ich glaube, Sie können das gleiche tun mit SHA-1 und erhalten bessere Ergebnisse.
BTW, nur eine persönliche Meinung, dressing ein md5-hash als GUID nicht machen es ein guter GUID. GUIDs von Ihrem Wesen sind nicht Deterministisch. dies fühlt sich wie ein cheat. Warum nicht einfach einen Spaten einen Spaten nennen und nur sagen es ist ein Text-hash der Eingabe. Sie konnte tun, die durch die Nutzung dieser Linie, sondern die neue guid-line:
Ok, rufen Sie Ihren hash eine "GUID" - problem gelöst. Oder ist das eigentliche problem, dass Sie müssen ein
Guid
Objekt?ich wünschte, es waren einfach.. 🙂 aber ja, ich brauche eine 'GUID' - Objekt
"GUIDs von Ihrem Wesen sind nicht Deterministisch" - dies gilt nur für bestimmte Typen ('Versionen') von GUIDs. Aber ich Stimme zu, dass "dressing ein md5-hash als GUID nicht machen einen guten GUID" aus anderen Gründen als Dinkel von @Bradley Grainger und @Rob Fonseca-Ensor, und meine Antwort auf diese Frage.
InformationsquelleAutor ryber
Müssen Sie eine Unterscheidung zwischen Instanzen der Klasse
Guid
und Bezeichner, die weltweit einzigartig sind. Eine "deterministische guid" ist eigentlich ein hash (wie gezeigt, durch Ihren Anruf, umprovider.ComputeHash
). Hashes haben eine viel höhere chance von Kollisionen (zwei verschiedene strings geschieht zu erzeugen, die denselben hash) als Guid erstellt überGuid.NewGuid
.So, das problem mit deinem Ansatz ist, dass Sie haben, um ok zu sein mit der Möglichkeit, dass zwei unterschiedliche Pfade wird die gleiche GUID. Wenn Sie benötigen eine Kennung, die einzigartig ist für einen bestimmten Pfad-string, dann die einfachste Sache zu tun ist verwenden Sie einfach die Zeichenfolge. Wenn Sie den string verdeckt werden, von Ihren Nutzern, verschlüsseln können Sie mit ROT13 oder etwas stärker...
Versuch, Schuhlöffel etwas, das nicht eine Reine GUID in die GUID-Datentyp könnte dazu führen Wartungs-Probleme in der Zukunft...
InformationsquelleAutor Rob Fonseca-Ensor