Chciałbym mieć wydajne narzędzie do generowania unikalnych sekwencji bajtów. UUID jest dobrym kandydatem, ale UUID.randomUUID().toString()
generuje takie rzeczy, 44e128a5-ac7a-4c9a-be4c-224b6bf81b20
które są dobre, ale wolałbym ciąg bez myślnika.
Szukam wydajnego sposobu na generowanie losowych ciągów, tylko ze znaków alfanumerycznych (bez myślników ani innych symboli specjalnych).
Odpowiedzi:
Robi to:
źródło
Kreski nie muszą być usuwane z żądania HTTP, jak widać na adresie URL tego wątku. Ale jeśli chcesz przygotować dobrze sformułowany adres URL bez zależności od danych, powinieneś użyć URLEncoder.encode (dane ciągów, kodowanie ciągów) zamiast zmieniać standardową formę swoich danych. W przypadku reprezentacji ciągu UUID myślniki są normalne.
źródło
http://stackoverflow.com/questions/3804591/efficient-method-to-generate-uuid-string-in-java-uuid-randomuuid-tostring-w?rq=1
Skończyło się na napisaniu czegoś własnego na podstawie implementacji UUID.java. Zauważ, że nie generuję identyfikatora UUID , zamiast tego po prostu losowy 32-bajtowy ciąg szesnastkowy w najbardziej efektywny sposób, jaki mogłem wymyślić.
Realizacja
Stosowanie
Testy
Niektóre z wejść, które przetestowałem, aby upewnić się, że działają:
źródło
Użyłem JUG (Java UUID Generator) do wygenerowania unikalnego ID. Jest wyjątkowy w przypadku maszyn JVM. Całkiem dobry w użyciu. Oto kod w celach informacyjnych:
Bibliotekę można pobrać z: https://github.com/cowtowncoder/java-uuid-generator
źródło
java.util.UUID
alternatywy.Prostym rozwiązaniem jest
(Podobnie jak w przypadku istniejących rozwiązań, tyle tylko, że unika wywołania String # replaceAll . Zastępowanie wyrażenia regularnego nie jest tutaj wymagane, więc String # replace wydaje się bardziej naturalne, chociaż technicznie nadal jest implementowane za pomocą wyrażeń regularnych. Biorąc pod uwagę, że generowanie UUID jest bardziej kosztowne niż wymiana, nie powinno być znaczącej różnicy w czasie wykonywania).
Użycie klasy UUID jest prawdopodobnie wystarczająco szybkie dla większości scenariuszy, chociaż spodziewałbym się, że jakiś wyspecjalizowany wariant napisany odręcznie, który nie wymaga postprocessingu, będzie szybszy. W każdym razie, wąskim gardłem ogólnych obliczeń będzie zwykle generator liczb losowych. W przypadku klasy UUID wykorzystuje SecureRandom .
Wybór generatora liczb losowych jest również kompromisem zależnym od aplikacji. Jeśli jest wrażliwy na bezpieczeństwo, SecureRandom jest ogólnie zaleceniem. W przeciwnym razie ThreadLocalRandom jest alternatywą (szybszą niż SecureRandom lub stary Random , ale nie jest bezpieczna kryptograficznie).
źródło
Jestem zdumiony, widząc tak wiele pomysłów zastępujących ciągi UUID. Co powiesz na to:
Jest to szybka metoda, ponieważ cała metoda toString () UUID jest już droższa, nie wspominając o wyrażeniu regularnym, które musi zostać przeanalizowane i wykonane, lub o zastąpieniu pustym łańcuchem.
źródło
String.format("0x%016x%016x", f.getMostSignificantBits(), f.getLeastSignificantBits())
replace
.Właśnie skopiowałem metodę UUID toString () i zaktualizowałem ją, aby usunąć z niej „-”. Będzie to znacznie szybsze i prostsze rozwiązanie niż jakiekolwiek inne rozwiązanie
Stosowanie:
generateUUIDString(UUID.randomUUID())
Kolejna implementacja wykorzystująca refleksję
źródło
Używam org.apache.commons.codec.binary.Base64, aby przekonwertować UUID na bezpieczny dla adresu URL unikalny ciąg o długości 22 znaków i takiej samej unikalności jak UUID.
Opublikowałem swój kod na Przechowywanie UUID jako ciąg base64
źródło
Właśnie zaimplementowałem tę klasę narzędziową, która tworzy UUID jako ciąg znaków z myślnikami lub bez . Możesz swobodnie korzystać i udostępniać. Mam nadzieję, że to pomoże!
Oto wynik:
źródło