Y a-t-il un moyen de générer 8 caractères de longue chaîne aléatoire et unique en Java? , puis ID code> sera par exemple wf41av5g Code> p> p>
12 Réponses :
La propriété uuid code> classe.
C'est bon mais j'ai besoin de 8 caractères seulement, sinon je l'utiliserais sans doute.
Les uuids sont structurés; Leurs champs sont générés de manière particulière et tous les bits sont également uniques. Cela signifie que vous ne pouvez pas simplement trancher des morceaux aléatoires et vous attendre à ce qu'ils restent uniques. Voir le commentaire de Danny sur La réponse de Oliver pour une illustration de ce problème en action.
@danny, I.e., chaîne huitchars = unique.Substring (28); Code>
public String getRandomString(int length, char[] characterSet) {
StringBuilder sb = new StringBuilder();
for (int loop = 0; loop < length; loop++) {
int index = new Random().nextInt(characterSet.length);
sb.append(characterSet[index]);
}
String nonce = sb.toString();
return nonce;
}
solution rapide et sale à l'aide de java.util.uuid :
Je l'ai généré deux fois et FF808181328864BA01328864BC590000 et FF808181328864BA02328864BC5902300. Si je ne prends que 8 premiers caractères, je vais avoir la même chaîne :(
Veuillez essayer le code suivant:
Je crois que cela ne assez i> fait la bonne chose, car de long. Cependant, vous pouvez étendre le code aux cordes courtes zéro au lieu de les couper.
Vous pouvez utiliser Randomstringutils a>
Je suis curieux, comment cela résoudra-t-il la question de l'OP? Je ne vois rien dans la documentation qui assure l'unicité.
Si l'unicité est important, vous ne pouvez pas simplement générer au hasard des chaînes. Il n'y a aucun moyen d'éviter une collision. Même les uuids peuvent entrer en collision, bien qu'il soit tout à fait improbable. P>
Vous pouvez conserver une enregistrement des chaînes que vous avez utilisées et lorsque vous générez une nouvelle chaîne aléatoire, vérifiez l'enregistrement pour voir s'il s'agit d'un duplicata, et si oui, jetez-le et réessayez. P>
Cependant, ce que je suggérerais, c'est que vous ne générez pas de nombres aléatoires. Gardez plutôt un compteur et cryptez sa sortie pour produire des nombres aléatoires. Celles-ci sont garanties pour ne jamais entrer en collision si vous faites cela correctement. Voir une réponse antérieure de la mienne ou un de Rossum P >
Vous pouvez créer cette chaîne à la base de l'heure actuelle. P>
Par exemple: p>
2014 06 04 16 21 20 79 ---> 14 06 04 16 21 20 79 P>
Ensuite, vous pouvez traduire tous les deux chiffres (à l'exception des deux derniers) pour un caractère alphanumérique à l'aide de la table ( http: / /en.wikipedia.org/wiki/base64 - Notez que tous sont plus petits que 59) p>
alors vous recevrez p>
14 - O
06 - G
04 - e
16 - q
21 - V
20 - u
p>
ogeqvu79 <- exactement 8 caractères. Un peu compliqué, mais cela fonctionne si vous n'appeleriez pas votre fonction souvent à 0,01 s p>
Cela ne garantit pas l'unicité - Pensez à des threads simultanés ou même à un seul fil qui le faisait à plusieurs reprises dans une succession très rapide
Aujourd'hui, vous devez avoir votre réponse, mais pour ceux qui atteignent cette page, essayez ce code:
public class RandomValueXML {
public static void main(String[] args) {
System.out.println(org.apache.commons.lang3.RandomStringUtils.random(6, true, true));
}
static Set<String> getRandomUniqueStrings(int count, int length, boolean letters, boolean numbers){
Set<String> rus = new HashSet<>();
while (rus.size() < count){
rus.add(RandomStringUtils.random(length, letters, numbers));
}
return rus;
}
}
Veuillez noter que la réponse acceptée est ce que vous suggérez. Ajoutez-vous sur le dessus? Veuillez prendre le tour et lire Comment Répondre .
long unixTime = System.currentTimeMillis() / 1000L; String unique_no=Long.toHexString(unixTime).toUpperCase(); gives you unique 8 chars String in HEX format.
Pas unique si vous appelez plus d'une fois une seconde, et certainement pas aléatoire!
Je sais que c'est un ancien poste, mais cela peut aider quelqu'un.
Celui-ci a travaillé pour moi: p>
public class UniqueIdGenerator {
private static final String MIX_STRING = "abcdefghijklmnopqrstuvwxyz1234567890";
private static final int MIX_STRING_LENGTH = MIX_STRING.length();
public static String fromBase10(final long base10) {
if (base10 == 0)
return "0";
long temp = base10;
final StringBuilder sb = new StringBuilder();
while (temp > 0) {
temp = fromBase10(temp, sb);
}
return sb.reverse().toString();
}
private static Long fromBase10(final long base10, final StringBuilder sb) {
final int rem = (int) (base10 % MIX_STRING_LENGTH);
sb.append(MIX_STRING.charAt(rem));
return base10 / MIX_STRING_LENGTH;
}
}
Je n'ai aucune idée s'il existe une méthode qui peut produire une chaîne aléatoire unique à 8 chiffres, mais je créerais un service de générateur de clé hors ligne qui génère constamment des touches aléatoires et les insérez-les à la table des clés si la clé n'existe pas dans La table et chaque fois que votre application en ligne a besoin d'une touche, elle peut extraire l'une des touches préformées. P>
Bonjour et bienvenue à tellement! Veuillez lire le Tour et Comment faire J'écris une bonne réponse? Je ne pense pas que c'est ce que le PO a demandé.
Comme aucune des réponses ci-dessus assure l'unicité, j'ai décidé d'ajouter une autre réponse. strong> Tout d'abord, nous définissons toutes les options valides dans un tableau: P> ifJjuYrR
NpY3TfIU
LGFm8Ng9
sV4Gctb7
4fyhlSuQ
Pas si vous voulez plus de 62 ^ 8 d'entre eux (en supposant que vous voulez des alphanumériques uniquement) ... Vous voulez probablement une chaîne aléatoire, puis recherchez une table de chaînes déjà générées.
Définir "unique": chaque fois que la méthode est exécutée, une chaîne différente est renvoyée? Ou tous les caractères sont différents les uns des autres? autre chose?