Je voudrais un utilitaire efficace pour générer des séquences d'octets uniques. UUID est un bon candidat mais UUID.randomUUID().toString()
génère des trucs comme 44e128a5-ac7a-4c9a-be4c-224b6bf81b20
ce qui est bien, mais je préférerais une chaîne sans tiret.
Je recherche un moyen efficace de générer des chaînes aléatoires, uniquement à partir de caractères alphanumériques (pas de tirets ni d'autres symboles spéciaux).
Réponses:
Cela le fait:
la source
Les tirets n'ont pas besoin d'être supprimés de la requête HTTP comme vous pouvez le voir dans l'URL de ce fil. Mais si vous souhaitez préparer une URL bien formée sans dépendre des données, vous devez utiliser URLEncoder.encode (données String, encodage String) au lieu de changer la forme standard de vos données. Pour les tirets de représentation sous forme de chaîne UUID, c'est normal.
la source
http://stackoverflow.com/questions/3804591/efficient-method-to-generate-uuid-string-in-java-uuid-randomuuid-tostring-w?rq=1
J'ai fini par écrire quelque chose de moi-même basé sur l'implémentation UUID.java. Notez que je ne génère pas d'UUID , mais simplement une chaîne hexadécimale de 32 octets aléatoire de la manière la plus efficace à laquelle je puisse penser.
la mise en oeuvre
Usage
Des tests
Certaines des entrées que j'ai testées pour m'assurer que cela fonctionne:
la source
J'ai utilisé JUG (Java UUID Generator) pour générer un identifiant unique. Il est unique parmi les JVM. Très bon à utiliser. Voici le code pour votre référence:
Vous pouvez télécharger la bibliothèque sur: https://github.com/cowtowncoder/java-uuid-generator
la source
java.util.UUID
alternatives sérieuses .Une solution simple est
(Comme les solutions existantes, seulement cela évite l' appel String # replaceAll . Le remplacement d'expression régulière n'est pas nécessaire ici, donc String # replace semble plus naturel, bien que techniquement il soit toujours implémenté avec des expressions régulières. Étant donné que la génération de l'UUID est plus coûteux que le remplacement, il ne devrait pas y avoir de différence significative dans l'exécution.)
L'utilisation de la classe UUID est probablement assez rapide pour la plupart des scénarios, même si je m'attendrais à ce que certaines variantes manuscrites spécialisées, qui ne nécessitent pas de post-traitement, soient plus rapides. Quoi qu'il en soit, le goulot d'étranglement du calcul global sera normalement le générateur de nombres aléatoires. Dans le cas de la classe UUID, il utilise SecureRandom .
Le générateur de nombres aléatoires à utiliser est également un compromis qui dépend de l'application. S'il est sensible à la sécurité, SecureRandom est, en général, la recommandation. Sinon, ThreadLocalRandom est une alternative (plus rapide que SecureRandom ou l'ancien Random , mais pas cryptographiquement sécurisé).
la source
Je suis étonné de voir autant de chaînes remplacer les idées d'UUID. Que dis-tu de ça:
C'est la façon la plus rapide de le faire puisque tout le toString () de l'UUID est déjà plus cher sans parler de l'expression régulière qui doit être analysée et exécutée ou le remplacement par une chaîne vide.
la source
String.format("0x%016x%016x", f.getMostSignificantBits(), f.getLeastSignificantBits())
replace
.Je viens de copier la méthode UUID toString () et je l'ai juste mise à jour pour en supprimer "-". Ce sera beaucoup plus rapide et simple que toute autre solution
Usage:
generateUUIDString(UUID.randomUUID())
Une autre implémentation utilisant la réflexion
la source
J'utilise org.apache.commons.codec.binary.Base64 pour convertir un UUID en une chaîne unique sécurisée pour les URL, d'une longueur de 22 caractères et de la même unicité que l'UUID.
J'ai publié mon code sur le stockage de l'UUID en tant que chaîne base64
la source
Je viens d'implémenter cette classe utilitaire qui crée des UUID sous forme de chaîne avec ou sans tirets . N'hésitez pas à utiliser et à partager. J'espère que ça aide!
Voici la sortie:
la source