2013-12-12 8 views
33

Come suggerito nel titolo, è necessario creare un ID casuale di 17 caratteri. Qualcosa come "AJB53JHS232ERO0H1". Anche l'ordine di lettere e numeri è casuale. Ho pensato di creare un array con le lettere A-Z e una variabile 'check' che renda a 1-2. E in un ciclo;Creazione di una stringa casuale con A-Z e 0-9 in Java

Randomize 'check' to 1-2. 
If (check == 1) then the character is a letter. 
Pick a random index from the letters array. 
else 
Pick a random number. 

Ma mi sembra che ci sia un modo più semplice per farlo. È lì?

+2

http://stackoverflow.com/questions/41107/how-to-generate-a-random-alpha-numeric-string – aquaraga

+0

puoi mettere le tue lettere e le cifre in un array e poi scegliere casualmente gli elementi da esso fino a raggiungere la dimensione desiderata. – wxyz

risposta

66

Qui è possibile utilizzare il mio metodo per la generazione di stringa casuale

protected String getSaltString() { 
     String SALTCHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 
     StringBuilder salt = new StringBuilder(); 
     Random rnd = new Random(); 
     while (salt.length() < 18) { // length of the random string. 
      int index = (int) (rnd.nextFloat() * SALTCHARS.length()); 
      salt.append(SALTCHARS.charAt(index)); 
     } 
     String saltStr = salt.toString(); 
     return saltStr; 

    } 

Il metodo di cui sopra dalla mia borsa utilizzando per generare una stringa sale a scopo di accesso.

+0

Posso suggerire di sostituire 'StringBuffer' con un' StringBuilder', non è necessario avere un impl di thread-safe. qui –

+6

O semplicemente crea un 'char []' dato che sai esattamente quanto tempo sarà. Non c'è bisogno di aggiungere nulla. Userei anche 'Random.nextInt' piuttosto che chiamare' nextFloat' e moltiplicarlo per la lunghezza. –

+1

Si noti che la quantità media di numeri non sarà uguale al numero di lettere. –

51

RandomStringUtils da Apache Commons-lang potrebbe aiutare:

RandomStringUtils.randomAlphanumeric(17).toUpperCase() 

2017 aggiornamento: RandomStringUtils è stato deprecato, si dovrebbe ora utilizzare RandomStringGenerator.

+2

Considerare l'aggiornamento della risposta quando Apache lo ha sostituito con 'RandomStringGenerator' in common-text. –

3

Si può facilmente farlo con un ciclo for,

public static void main(String[] args) { 
    String aToZ="ABCD.....1234"; // 36 letter. 
    String randomStr=generateRandom(aToZ); 

} 

private static String generateRandom(String aToZ) { 
    Random rand=new Random(); 
    StringBuilder res=new StringBuilder(); 
    for (int i = 0; i < 17; i++) { 
     int randIndex=rand.nextInt(aToZ.length()); 
     res.append(aToZ.charAt(randIndex));    
    } 
    return res.toString(); 
} 
4

Tre passi per implementare la funzione:

Passo # 1 È possibile specificare una stringa, compresi i caratteri AZ e 0- 9.

Mi piace.

String candidateChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 

Passo # 2 Poi, se si desidera generare un char caso da questa stringa candidato. È possibile utilizzare

candidateChars.charAt(random.nextInt(candidateChars.length())); 

Passo # 3 Infine, specificare la lunghezza della stringa casuale da generare (nella descrizione, è 17). Scrive un ciclo for e aggiunge i caratteri casuali generati nel passaggio 2 all'oggetto StringBuilder.

Sulla base di questo, ecco un esempio public class RandomTest {

public static void main(String[] args) { 

    System.out.println(generateRandomChars(
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 17)); 
} 

/** 
* 
* @param candidateChars 
*   the candidate chars 
* @param length 
*   the number of random chars to be generated 
* 
* @return 
*/ 
public static String generateRandomChars(String candidateChars, int length) { 
    StringBuilder sb = new StringBuilder(); 
    Random random = new Random(); 
    for (int i = 0; i < length; i++) { 
     sb.append(candidateChars.charAt(random.nextInt(candidateChars 
       .length()))); 
    } 

    return sb.toString(); 
} 

} 
Problemi correlati