Ich benötige eine eindeutige Kennung in .NET (kann die GUID nicht verwenden, da sie für diesen Fall zu lang ist).
Denken die Leute, dass der hier verwendete Algorithmus ein guter Kandidat ist, oder haben Sie andere Vorschläge?
c#
.net
uniqueidentifier
Noel
quelle
quelle
Antworten:
Dies ist eine gute - http://www.singular.co.nz/blog/archive/2007/12/20/shortguid-a-shorter-and-url-friendly-guid-in-c-sharp.aspx
und auch hier YouTube-ähnliche GUID
Sie könnten Base64 verwenden:
quelle
Ich benutze einen ähnlichen Ansatz wie Dor Cohens, entferne aber einige Sonderzeichen:
Dies gibt nur alphanumerische Zeichen aus. Es ist nicht garantiert, dass die UIDs immer dieselbe Länge haben. Hier ist ein Probelauf:
quelle
Behalten Sie ein Basisdatum (in diesem Fall den 1. Januar 2016) bei, ab dem Sie mit der Generierung dieser IDs beginnen. Dadurch werden Ihre IDs kleiner.
Generierte Nummer: 3af3c14996e54
quelle
milliseconds
ist immer 0 für diesesDateTime
ObjektEinfaches nutzbares Paket. Ich benutze es für den zeitlichen Anforderungs-ID-Generator.
https://www.nuget.org/packages/shortid
https://github.com/bolorundurowb/shortid
Verwendet
System.Random
(von der Github-Seite)
Wenn Sie den Typ der generierten ID steuern möchten, indem Sie angeben, ob Sie Zahlen, Sonderzeichen und die Länge möchten, rufen Sie die Generate-Methode auf und übergeben Sie drei Parameter. Der erste ist ein Boolescher Wert, der angibt, ob Sie Zahlen möchten, der zweite ein Boolescher Wert, der angibt, ob Sie möchten Sonderzeichen, die letzte eine Zahl, die Ihre Längenpräferenz angibt.
quelle
Soweit ich weiß, ist es nicht garantiert einzigartig , nur einen Teil einer GUID zu entfernen - tatsächlich ist es alles andere als einzigartig.
Das kürzeste, was ich weiß, das globale Einzigartigkeit garantiert, wird in diesem Blog-Beitrag von Jeff Atwood vorgestellt . In dem verlinkten Beitrag beschreibt er mehrere Möglichkeiten, eine GUID zu verkürzen und sie am Ende über Ascii85-Codierung auf 20 Byte zu reduzieren .
Wenn Sie jedoch unbedingt eine Lösung benötigen, die nicht länger als 15 Byte ist, haben Sie leider keine andere Wahl, als etwas zu verwenden, von dem nicht garantiert wird, dass es global einzigartig ist.
quelle
IDENTITY-Werte sollten in einer Datenbank eindeutig sein, aber Sie sollten sich der Einschränkungen bewusst sein. Dies macht beispielsweise das Einfügen von Massendaten grundsätzlich unmöglich, was Sie verlangsamt, wenn Sie mit einer sehr großen Anzahl von Datensätzen arbeiten.
Möglicherweise können Sie auch einen Datums- / Zeitwert verwenden. Ich habe mehrere Datenbanken gesehen, in denen Datum und Uhrzeit als PK verwendet werden, und obwohl es nicht besonders sauber ist, funktioniert es. Wenn Sie die Einfügungen steuern, können Sie effektiv sicherstellen, dass die Werte im Code eindeutig sind.
quelle
Für meine lokale App verwende ich diesen zeitbasierten Ansatz:
quelle
Hier ist meine Lösung nicht sicher für Parallelität, nicht mehr von 1000 GUIDs pro Sekunde und threadsicher.
Code nicht optimiert, nur Probe!.
quelle
UtcNow
für jede Millisekunde ein eindeutiger Tick-Wert zurückgegeben wird: Gemäß den Anmerkungen hängt die Auflösung vom System-Timer ab. Außerdem sollten Sie sicherstellen, dass sich die Systemuhr nicht rückwärts ändert! (Da die Antwort von user13971889 diese Frage an die Spitze meines Feeds gestoßen hat und ich diese Antwort kritisiert habe, sollte ich diese Kritik hier wiederholen.)Wenn Ihre App nicht über ein paar MILLIIONEN Personen verfügt, die in der GLEICHEN MILLISECOND eine kurze, eindeutige Zeichenfolge generieren, können Sie über die Verwendung der folgenden Funktion nachdenken.
Ändern Sie JJJJ in JJ, wenn Sie Ihre App in den nächsten 99 Jahren nur noch verwenden müssen.
Update 20160511 : Richtig Zufallsfunktion
- Hinzufügen Objekt sperren
- Move Zufallsvariable aus Randomfunktion
Ref
quelle
lock
ist, dass Sie dieselbeRandom
Instanz wiederverwenden können . Ich denke, Sie haben vergessen, diese Zeile zu löschen!Ich weiß, dass es ziemlich weit vom veröffentlichten Datum entfernt ist ... :)
Ich habe einen Generator, der nur 9 Hexa-Zeichen erzeugt , zB: C9D6F7FF3, C9D6FB52C
quelle
Basierend auf der Antwort von @ dorcohen und dem Kommentar von @ pootzko. Sie können dies verwenden. Es ist sicher über den Draht.
quelle
Jzhw2oVozkSNa2IkyK4ilA2
oder versuchen Sie es unter dotnetfiddle.net/VIrZ8jBasierend auf einigen anderen ist hier meine Lösung, die eine andere codierte Richtlinie bereitstellt, die URL- (und Docker-) sicher ist und keine Informationen verliert:
Beispielausgaben sind:
quelle
In C # hat ein
long
Wert 64 Bit. Wenn er mit Base64 codiert wird, gibt es 12 Zeichen, einschließlich 1 Auffüllung=
. Wenn wir die Polsterung kürzen=
, gibt es 11 Zeichen.Eine verrückte Idee hier ist, dass wir eine Kombination aus Unix-Epoche und einem Zähler für einen Epochenwert verwenden könnten, um einen Wert zu bilden
long
. Die Unix-Epoche in C #DateTimeOffset.ToUnixEpochMilliseconds
hat daslong
Format, aber die ersten 2 Bytes der 8 Bytes sind immer 0, da sonst der Datums- / Uhrzeitwert größer als der maximale Datums- / Uhrzeitwert ist. Das gibt uns also 2 Bytes, in die wir einenushort
Zähler einfügen können.Insgesamt können wir also eine eindeutige ID haben, solange die Anzahl der ID-Generierungen 65536 pro Millisekunde nicht überschreitet:
quelle
Wenn Sie die Zeichenfolge nicht eingeben müssen, können Sie Folgendes verwenden:
Dadurch wird die Guid in eine 8-stellige Zeichenfolge wie folgt konvertiert:
{b77a49a5-182b-42fa-83a9-824ebd6ab58d} -> "䦥 띺 ᠫ 䋺 ꦃ 亂 檽 趵"
{c5f8f7f5-8a7c-4511-b667-8ad36b446617} -> " 엸 詼 䔑 架 펊 䑫 ᝦ"
quelle
Hier ist meine kleine Methode, um eine zufällige und kurze eindeutige ID zu generieren. Verwendet ein kryptografisches Rng zur sicheren Erzeugung von Zufallszahlen. Fügen Sie der
chars
Zeichenfolge die erforderlichen Zeichen hinzu .quelle
Um keine Zeichen (+ / -) zu verlieren und wenn Sie Ihre Guid in einer URL verwenden möchten, muss sie in base32 umgewandelt werden
für 10 000 000 kein doppelter Schlüssel
quelle
Verwendung
Es ist keine Raketenwissenschaft, zurück zu konvertieren, also werde ich dich so sehr verlassen.
quelle
Sie können es mit der folgenden Bibliothek versuchen:
quelle
quelle
UtcNow
für jede Millisekunde ein eindeutiger Tick-Wert zurückgegeben wird: Gemäß den Anmerkungen hängt die Auflösung vom System-Timer ab. Außerdem sollten Sie sicherstellen, dass sich die Systemuhr nicht rückwärts ändert! (Die Antwort von ur3an0 hat auch diese Probleme.)Sie können verwenden
seine
6
nur schöne Zeichen,599527
,143354
und wenn Benutzer es einfach virifizieren
hoffe das hilft dir
quelle
quelle
Ich benutze
Guid.NewGuid().ToString().Split('-')[0]
, es bekommt das erste Element aus dem Array durch das '-' getrennt. Es ist genug, um einen eindeutigen Schlüssel darzustellen.quelle