Comment créer convivial Identifiants uniques, Uuid ou d'autres identifiants uniques en Java
J'ai l'habitude d'utiliser l'UUID de la classe pour générer des Identifiants uniques. Cela fonctionne bien si ces Identifiants sont utilisés par les systèmes techniques seulement, ils ne se soucient pas combien de temps ils sont:
System.out.println(UUID.randomUUID().toString());
> 67849f28-c0af-46c7-8421-94f0642e5d4d
Est là une belle façon de créer convivial Identifiants uniques (comme ceux de tinyurl) qui sont un peu plus courtes que les Uuid? Cas d'utilisation: vous voulez envoyer des Identifiants par e-Mail à vos clients qui visitent votre site, puis inscrivez le nombre dans une forme, comme un bon ID.
Je suppose que Uuid se produit également au travers de l'ensemble de la gamme de la 128 Bits de large de l'UUID. Alors serait-il sage d'utiliser le bas de 64 Bits par exemple?
System.out.println(UUID.randomUUID().getLeastSignificantBits());
Tout commentaire est le bienvenu.
Bien sûr, mais l'id s'affiche dans les médias imprimés. Donc, le plus court sera le mieux.
Pour imprimable Url, de minimiser la probabilité d'erreur humaine à l'aide de Base32 l'encodage. Personnellement, je pense que la z-base-32 format est le meilleur pour ce but, car il a été spécialement conçu pour être utilisé par les humains.
Je suis sûr que TinyURL et d'autres raccourcisseurs d'url simplement de maintenir une liste de toutes les Uuid et de lui attribuer une auto-incrémenté d'index, et utilise la base-64 version que l'affichage de l'ID. C'est la façon dont vous obtenez des URLs comme
http://tinyurl.com/2
et http://bit.ly/2
.
OriginalL'auteur basZero | 2011-01-12
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, votre hypothèse est peut-être incorrect, selon l'UUID de type (1, 2, 3, ou 4). De la Java UUID docs:
La meilleure façon de faire ce que vous faites est de générer une chaîne de caractères aléatoires avec un code qui ressemble à ceci (source):
Si vous êtes très inquiet à propos de collisions ou de quelque chose, je vous suggère de
base64
encoder votre UUID qui devrait réduire sa taille.Morale de l'histoire: ne pas compter sur les différentes parties de l'Uuid comme ils sont conçu de manière holistique. Si vous avez besoin de s'appuyer sur les différents éléments d'un UUID, assurez-vous de vous familiariser avec l'UUID type et la mise en œuvre.
Random
. Il est égalementSecureRandom
qui devrait être beaucoup plus difficiles à prévoir (peut ou peut ne pas être un problème, mais des choses comme des clés de session sont une application où vous ne voulez pas un naïf LCG). Ce que l'OP décrivent avec des bons Identifiants peuvent également être un cas où vous ne voulez pas une personne au hasard réclamer de quelqu'un d'autre.Joey est un bon point. Cela dépend si oui ou non votre application doit être cryptographique sécurisé ou pas.
Oh, et vous devriez probablement déplacer l'instance aléatoire pour le corps de la classe au lieu d'en avoir dans la méthode. Le semis se fait à l'heure actuelle et que vous souhaitez seulement à voir une fois, pas tout le temps la méthode est appelée.
La version encodée en base 64 de
67849f28-c0af-46c7-8421-94f0642e5d4d
estNjc4NDlmMjgtYzBhZi00NmM3LTg0MjEtOTRmMDY0MmU1ZDRk
. Donc, ce repli de la méthode n'est pas réellement réduire la taille.Prendre la 128 bits de la forme de l'UUID (pas la chaîne) et ensuite de base-64 version est plus courte en effet: 22 caractères.
OriginalL'auteur David Titarenco
Ici est une autre approche pour la génération de convivial Id:
http://thedailywtf.com/Articles/The-Automated-Curse-Generator.aspx
(Mais vous devriez aller pour le mauvais mot de filtre)
OriginalL'auteur Cephalopod
Tout UUID/Guid est de 16 Octets de données. Ces 16 octets peuvent facilement être codé à l'aide de BASE64 (ou BASE64url), puis dépouillé de tous les "=" caractères à la fin de la chaîne.
Cela donne une belle, courte chaîne qui détient toujours les mêmes données que l'UUID/Guid. En d'autres termes, il est possible de recréer l'UUID/Guid à partir des données si une telle devient nécessaire.
OriginalL'auteur JensG
Ici un moyen pour générer une URL conviviale 22 caractères UUID
Pour votre cas d'utilisation, il serait mieux de suivre l'exécution d'un comte de l'utilisateur inscrit, et, pour chaque valeur, de générer une chaîne de jeton comme ceci:
Pour des raisons de sécurité, il serait mieux si vous faites les valeurs de non-séquentielle, de sorte que chaque fois qu'un utilisateur s'enregistre, vous pouvez incrémenter la valeur disons par 1024 (Ce serait bien de générer des uuid pour 2^64 /2^10 = 2^54 les utilisateurs qui est très certainement plus que vous ne le feriez jamais besoin 🙂
OriginalL'auteur Lior
Que pour vous 🙂 :
Remarque: Pour les applications que vous ne voulez probablement pas à utiliser
Random
. Il est égalementSecureRandom
qui devrait être beaucoup plus difficiles à prévoir (peut ou peut ne pas être un problème, mais des choses comme des clés de session sont une application où vous ne voulez pas un naïf LCG). Ce que l'OP décrivent avec des bons Identifiants peuvent également être un cas où vous ne voulez pas une personne au hasard réclamer de quelqu'un d'autre.à l'aide de
System.nanoTime()
serait également plus fiable.OriginalL'auteur AlexR
Comment à ce sujet? En fait, ce code renvoie à 13 caractères(chiffres et alphabets minuscules) max.
OriginalL'auteur sanghoon2