Wie erzeugt 8 Byte unique id von GUID?
Ich versuche zu verwenden, solange eindeutige id innerhalb unserer C# - Anwendung (nicht global, und nur für eine session) für unsere Veranstaltungen. Wissen Sie, ob das folgende erzeugt eine eindeutige lange id?
public long GenerateId()
{
byte[] buffer = Guid.NewGuid().ToByteArray();
return BitConverter.ToInt64(buffer, 0);
}
Warum wir nicht verwenden GUID direkt? Wir denken, dass 8 bytes lang ist, ist gut genug.
Nein, das wird nur generiert einen zufälligen
Wenn Ihre Frage ist, "wie Generiere ich einen zufälligen long (Int64).NETZ", obwohl ich denke, es ist nicht, es ist eine doppelte Frage gute Antworten hier: stackoverflow.com/questions/677373/generate-random-values-in-c
mögliche Duplikate von: stackoverflow.com/questions/2867758/how-to-generate-a-long-guid
Int64
Wert. Bitte definieren: Unique
. Für die Auswahl muss eindeutig sein?Wenn Ihre Frage ist, "wie Generiere ich einen zufälligen long (Int64).NETZ", obwohl ich denke, es ist nicht, es ist eine doppelte Frage gute Antworten hier: stackoverflow.com/questions/677373/generate-random-values-in-c
mögliche Duplikate von: stackoverflow.com/questions/2867758/how-to-generate-a-long-guid
InformationsquelleAutor 5YrsLaterDBA | 2011-04-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, es nicht. Wie oft hervorgehoben, die auf Raymond Chen blog, der GUID ist eindeutig als ganzes, wenn Sie schneiden einfach ein Stück davon (z.B. mit nur 64 bytes aus seiner 128) es wird verlieren Sie seine (pseudo-)Eindeutigkeit garantiert.
Hier es ist:
Warum verwenden Sie nicht nur ein Zähler?
Ich Stimme mit @Aliostad. Ein
UUID
oderGUID
nicht garuantee Einzigartigkeit in keiner Weise...es ist nur sehr unwahrscheinlich, dass ein Duplikat zu sein.richtig in der Theorie, irrelevant in der Praxis. Mit dem Algorithmus, der im Artikel beschrieben, benötigen Sie zwei Maschinen mit der gleichen MAC-Adresse generieren, mit dem die GUIDs zur gleichen Zeit (in der Theorie nach unten, um die Nanosekunden) mit der gleichen clock-Sequenz-Nummer. Ich würde sagen, dies ist sehr unwahrscheinlich 🙂 . GUIDs werden entwickelt, einzigartig zu sein und als solche behandelt zu werden, ich bin mir ziemlich sicher, dass eine Menge von software-brechen würde, wenn eine doppelte GUID erzeugt wurde.
irrelevant in practice
gleiche für eine zufällige Int64-bit-Zahl. Die Wahrscheinlichkeit ist 1: 2^64...nicht für einen Int64 generiert schneiden die ersten 8 bytes der GUID. Sie würde einfach nur einen timestamp, und wenn die Uhr Auflösung ist nicht wirklich gut, Sie können zwei identische int64 für die nachfolgenden Ereignisse.
InformationsquelleAutor Matteo Italia
Pro die Guid.NewGuid MSDN-Seite,
Also, Ihre Methode kann produzieren eine eindeutige ID, aber es ist nicht garantiert.
InformationsquelleAutor Taylor Gerring
Können Sie destillieren eine 16-bit-Wert nach unten zu einem 8-bit-Wert, während immer noch Beibehaltung der gleichen Grad an Eindeutigkeit. Wenn Einzigartigkeit ist entscheidend, nicht das "roll your own" nichts. Stick mit GUIDs, es sei denn, Sie wirklich wissen, was Sie tun.
Wenn eine relativ naive Implementierung der Einzigartigkeit ausreichend ist, dann ist es immer noch besser, erstellen Sie Ihre eigenen IDs eher als stammen Sie aus GUIDs. Der folgende Codeausschnitt ist ein Auszug aus einem "Lokal Eindeutigen Bezeichner" - Klasse finde ich mich ziemlich oft. Es macht es einfach zu definieren, sowohl die Länge und der Bereich der Zeichen-Ausgabe.
In diesem Fall schließt die 1 (eins), I (i), 0 (null) und O (o) für die Sache eindeutig lesbare Ausgabe.
Zu ermitteln, wie effektiv 'eindeutig' Ihre Besondere Kombination von gültigen Zeichen-und ID-Länge sind, die Mathematik ist einfach genug, aber es ist immer noch schön, haben eine 'code-Beweis" Art (Xunit):
InformationsquelleAutor nathanchere
Nein, es nicht. Eine GUID ist eine 128-bit-Länge, lange nur 64 bit, die Ihnen fehlt, 64 bit der Informationen, so dass für zwei GUIDs zu generieren, die den gleichen langen Darstellung. Während die chance ist ziemlich schlank, es ist da.
InformationsquelleAutor Femaref
Ja, das wird wahrscheinlich einzigartig, aber da die Anzahl von bits sind weniger als GUID, die chance auf doppelte ist mehr als eine GUID - obwohl noch vernachlässigbar.
Sowieso, GUID selbst hat nicht garantieren Einzigartigkeit.
InformationsquelleAutor Aliostad
Wie ein paar andere gesagt haben, nur nehmen Teil der guid ist ein guter Weg, um zu ruinieren, seine Einzigartigkeit. Probieren Sie etwas wie dieses:
InformationsquelleAutor Mike Goatly
enerates eine 8-byte-Ascii85 Bezeichner basierend auf den aktuellen timestamp in Sekunden.
Garantiert einzigartig für jede Sekunde. 85% chance keine Kollisionen für die 5 generierten Ids innerhalb der gleichen Sekunde.
InformationsquelleAutor odyth
Wie gesagt in den meisten der anderen Antworten: Nein, Sie können nicht nehmen Sie nur ein Teil eines GUID-ohne Verlust der Einzigartigkeit.
Wenn Sie etwas benötigen, das ist kürzer und immer noch einzigartig, Lesen Sie diesen blog-Beitrag von Jeff Atwood:
Die Ausstattung unserer ASCII-Armor
Er zeigt mehrere Möglichkeiten, wie Sie zu verkürzen und so eine GUID, ohne Informationen zu verlieren. Die kürzeste ist 20 bytes (mit ASCII85-Kodierung).
Ja, das ist viel länger als die 8 bytes, die Sie wollte, aber es ist eine "echte" unique GUID...während alle versuche, Sie zu Stopfen etwas in 8 bytes wohl nicht wirklich einzigartig.
InformationsquelleAutor Christian Specht
P. S. Es ist sehr gut, die Jungs, dass Sie sich im Chat mit dem topic starter hier. Aber was ist mit Antworten müssen, dass andere user, wie mich???
InformationsquelleAutor alexkovelsky