42 votes

Comment générer une chaîne aléatoire de 20 caractères

Duplicata possible : Comment générer une chaîne aléatoire en Java

Je souhaite générer une chaîne aléatoire de 20 caractères sans utiliser de classes Apache. Je ne me soucie pas vraiment de savoir si c'est alphanumérique ou non. De plus, je vais le convertir en un tableau d'octets plus tard pour info.

Merci,

88voto

WhiteFang34 Points 28652

Voici. Spécifiez simplement les caractères que vous souhaitez autoriser sur la première ligne.

 char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray();
StringBuilder sb = new StringBuilder(20);
Random random = new Random();
for (int i = 0; i < 20; i++) {
    char c = chars[random.nextInt(chars.length)];
    sb.append(c);
}
String output = sb.toString();
System.out.println(output);

Si vous l'utilisez pour générer quelque chose de sensible comme un mot de passe réinitialiser l'URL ou le cookie d'ID de session ou réinitialiser le mot de passe temporaire, assurez-vous d'utiliser java.security.SecureRandom place. Les valeurs produites par java.util.Random et java.util.concurrent.ThreadLocalRandom sont mathématiquement prévisibles.

12voto

corsiKa Points 39442

J'utiliserais cette approche:

 String randomString(final int length) {
    Random r = new Random(); // perhaps make it a class variable so you don't make a new one every time
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < length; i++) {
        char c = (char)(r.nextInt((int)(Character.MAX_VALUE)));
        sb.append(c);
    }
    return sb.toString();
}

Si vous voulez un octet[], vous pouvez faire ceci :

 byte[] randomByteString(final int length) {
    Random r = new Random();
    byte[] result = new byte[length];
    for(int i = 0; i < length; i++) {
        result[i] = r.nextByte();
    }
    return result;
}

Ou tu peux faire ça

 byte[] randomByteString(final int length) {
    Random r = new Random();
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < length; i++) {
        char c = (char)(r.nextInt((int)(Character.MAX_VALUE)));
        sb.append(c);
    }
    return sb.toString().getBytes();
}

5voto

user unknown Points 15555

Vous pouvez utiliser la classe java.util.Random avec la méthode

 char c = (char)(rnd.nextInt(128-32))+32 

20x pour obtenir des octets, que vous interprétez comme ASCII. Si vous êtes d'accord avec ASCII.

32 est le décalage, à partir duquel les caractères sont imprimables en général.

3voto

maerics Points 47743
public String randomString(String chars, int length) {
  Random rand = new Random();
  StringBuilder buf = new StringBuilder();
  for (int i=0; i<length; i++) {
    buf.append(chars.charAt(rand.nextInt(chars.length())));
  }
  return buf.toString();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X