Ich möchte ein effizientes Dienstprogramm, um eindeutige Folgen von Bytes zu generieren. UUID ist ein guter Kandidat, UUID.randomUUID().toString()
generiert aber Dinge, 44e128a5-ac7a-4c9a-be4c-224b6bf81b20
die gut sind, aber ich würde eine strichlose Zeichenfolge bevorzugen.
Ich suche nach einer effizienten Möglichkeit, zufällige Zeichenfolgen nur aus alphanumerischen Zeichen (keine Bindestriche oder andere spezielle Symbole) zu generieren.
Antworten:
Das macht es:
quelle
Bindestriche müssen nicht aus der HTTP-Anforderung entfernt werden, wie Sie in der URL dieses Threads sehen können. Wenn Sie jedoch eine wohlgeformte URL ohne Abhängigkeit von Daten erstellen möchten, sollten Sie URLEncoder.encode (String-Daten, String-Codierung) verwenden, anstatt die Standardform Ihrer Daten zu ändern. Für die Darstellung von UUID-Zeichenfolgen sind Striche normal.
quelle
http://stackoverflow.com/questions/3804591/efficient-method-to-generate-uuid-string-in-java-uuid-randomuuid-tostring-w?rq=1
Am Ende habe ich etwas Eigenes geschrieben, das auf der Implementierung von UUID.java basiert. Beachten Sie, dass ich keine UUID generiere , sondern nur eine zufällige 32-Byte-Hex-Zeichenfolge auf die effizienteste Art und Weise, die ich mir vorstellen kann.
Implementierung
Verwendung
Tests
Einige der Eingaben, die ich getestet habe, um sicherzustellen, dass sie funktionieren:
quelle
Ich habe JUG (Java UUID Generator) verwendet, um eine eindeutige ID zu generieren. Es ist einzigartig für JVMs. Ziemlich gut zu bedienen. Hier ist der Code als Referenz:
Sie können die Bibliothek unter folgender Adresse herunterladen: https://github.com/cowtowncoder/java-uuid-generator
quelle
java.util.UUID
Alternativen gibt.Eine einfache Lösung ist
(Wie bei den vorhandenen Lösungen wird nur der Aufruf von String # replaceAll vermieden . Das Ersetzen von regulären Ausdrücken ist hier nicht erforderlich, sodass sich das Ersetzen von String # natürlicher anfühlt, obwohl es technisch immer noch mit regulären Ausdrücken implementiert wird. Angesichts der Tatsache, dass die UUID generiert wird teurer als der Austausch, sollte es keinen signifikanten Unterschied in der Laufzeit geben.)
Die Verwendung der UUID-Klasse ist für die meisten Szenarien wahrscheinlich schnell genug, obwohl ich erwarten würde, dass eine spezielle handgeschriebene Variante, für die keine Nachbearbeitung erforderlich ist, schneller ist. Wie auch immer, der Engpass bei der Gesamtberechnung ist normalerweise der Zufallszahlengenerator. Bei der UUID-Klasse wird SecureRandom verwendet .
Welcher Zufallszahlengenerator verwendet werden soll, hängt auch von der Anwendung ab. Wenn es sicherheitsrelevant ist, ist SecureRandom im Allgemeinen die Empfehlung. Andernfalls ist ThreadLocalRandom eine Alternative (schneller als SecureRandom oder das alte Random , jedoch nicht kryptografisch sicher).
quelle
Ich bin erstaunt zu sehen, wie viele Zeichenfolgen Ideen von UUID ersetzen. Wie wäre es damit:
Dies ist die schnellste Methode, da das gesamte toString () der UUID bereits teurer ist, ganz zu schweigen von dem regulären Ausdruck, der analysiert und ausgeführt werden muss, oder dem Ersetzen durch eine leere Zeichenfolge.
quelle
String.format("0x%016x%016x", f.getMostSignificantBits(), f.getLeastSignificantBits())
replace
.Ich habe gerade die UUID toString () -Methode kopiert und sie aktualisiert, um "-" daraus zu entfernen. Es wird viel schneller und unkomplizierter sein als jede andere Lösung
Verwendung:
generateUUIDString(UUID.randomUUID())
Eine weitere Implementierung mit Reflexion
quelle
Ich verwende org.apache.commons.codec.binary.Base64, um eine UUID in eine URL-sichere eindeutige Zeichenfolge zu konvertieren, die 22 Zeichen lang ist und dieselbe Eindeutigkeit wie die UUID aufweist.
Ich habe meinen Code beim Speichern der UUID als base64-Zeichenfolge veröffentlicht
quelle