Me gustaría una utilidad eficiente para generar secuencias únicas de bytes. UUID es un buen candidato pero UUID.randomUUID().toString()
genera cosas como44e128a5-ac7a-4c9a-be4c-224b6bf81b20
que es bueno, pero preferiría una cadena sin guiones.
Estoy buscando una forma eficiente de generar cadenas aleatorias, solo a partir de caracteres alfanuméricos (sin guiones u otros símbolos especiales).
Respuestas:
Esto lo hace:
fuente
No es necesario eliminar los guiones de la solicitud HTTP, como puede ver en la URL de este hilo. Pero si desea preparar una URL bien formada sin depender de los datos, debe usar URLEncoder.encode (String data, String encoding) en lugar de cambiar la forma estándar de sus datos. Para la representación de cadena UUID, los guiones son normales.
fuente
http://stackoverflow.com/questions/3804591/efficient-method-to-generate-uuid-string-in-java-uuid-randomuuid-tostring-w?rq=1
Terminé escribiendo algo propio basado en la implementación de UUID.java. Tenga en cuenta que no estoy generando un UUID , sino solo una cadena hexadecimal aleatoria de 32 bytes de la manera más eficiente que se me ocurra.
Implementación
Uso
Pruebas
Algunas de las entradas que he probado para asegurarme de que funcionan:
fuente
Usé JUG (Java UUID Generator) para generar una identificación única. Es único en todas las JVM. Bastante bueno de usar. Aquí está el código para su referencia:
Puede descargar la biblioteca desde: https://github.com/cowtowncoder/java-uuid-generator
fuente
java.util.UUID
alternativas serias .Una solución simple es
(Al igual que las soluciones existentes, solo que evita la llamada a String # replaceAll . Aquí no se requiere el reemplazo de la expresión regular, por lo que String # replace siente más natural, aunque técnicamente todavía se implementa con expresiones regulares. Dado que la generación del UUID es más costoso que el reemplazo, no debería haber una diferencia significativa en el tiempo de ejecución).
El uso de la clase UUID es probablemente lo suficientemente rápido para la mayoría de los escenarios, aunque esperaría que alguna variante escrita a mano especializada, que no necesita el procesamiento posterior, sea más rápida. De todos modos, el cuello de botella del cómputo general normalmente será el generador de números aleatorios. En el caso de la clase UUID, utiliza SecureRandom .
Qué generador de números aleatorios utilizar también es una compensación que depende de la aplicación. Si es sensible a la seguridad, SecureRandom es, en general, la recomendación. De lo contrario, ThreadLocalRandom es una alternativa (más rápido que SecureRandom o el antiguo Random , pero no criptográficamente seguro).
fuente
Me sorprende ver tantas ideas de reemplazo de cadenas de UUID. Qué tal esto:
Esta es la forma más rápida de hacerlo, ya que todo toString () de UUID ya es más costoso, sin mencionar la expresión regular que debe analizarse y ejecutarse o el reemplazo con una cadena vacía.
fuente
String.format("0x%016x%016x", f.getMostSignificantBits(), f.getLeastSignificantBits())
replace
.Acabo de copiar el método UUID toString () y lo actualicé para eliminar "-" de él. Será mucho más rápido y directo que cualquier otra solución
Uso:
generateUUIDString(UUID.randomUUID())
Otra implementación usando reflexión
fuente
Uso org.apache.commons.codec.binary.Base64 para convertir un UUID en una cadena única segura de URL que tiene 22 caracteres de longitud y tiene la misma unicidad que UUID.
Publiqué mi código en Almacenamiento de UUID como cadena base64
fuente