2011-10-17 30 views
8

C'è un modo per generare una stringa casuale e unica di 8 caratteri in Java?8 caratteri unici String in Java

String id = getRandomString(); 

e poi Id sarà ad esempio wf41Av5g

+1

Non se ne vogliono più di 62^8 (supponendo che si desiderino solo caratteri alfanumerici) ... probabilmente si desidera una stringa casuale, quindi si cerca una tabella di stringhe già generate. – bdares

+5

definire "univoco": ogni volta che viene eseguito il metodo viene restituita una stringa diversa? o tutti i caratteri sono diversi l'uno dall'altro? qualcos'altro? – amit

risposta

21

È possibile utilizzare RandomStringUtils

import org.apache.commons.lang.RandomStringUtils; 
public class RandomStringUtilsTrial { 
    public static void main(String[] args) { 
    System.out.print("8 char string >>>"); 
    System.out.println(RandomStringUtils.random(8, true, true)); 

    } 
} 
+7

Sono curioso, come si risolve la domanda dell'OP.Non vedo nulla nella documentazione che assicuri l'unicità – taylorcressy

+0

Sono anche curioso di questo. –

9

Il unicità proprietà dipende l'ambito in cui lo si utilizza. Java può sicuramente generare stringhe casuali, anche se se si desidera un identificatore universale univoco è possibile utilizzare la classe UUID.

String unique = UUID.randomUUID().toString(); 
+1

È buono ma ho bisogno solo di 8 caratteri, altrimenti lo userei senza e dubbio. –

+1

Gli UUID sono strutturati; i loro campi sono generati in modi particolari, e non tutti i bit sono ugualmente unici. Ciò significa che non puoi semplicemente separare parti casuali da loro e aspettarti che rimangano unici. Vedi il commento di Danny su [risposta di Oliver] (http://stackoverflow.com/questions/7791475/8-chars-unique-string-in-java/7791522#7791522) per un'illustrazione di questo problema in azione. –

+1

@danny, [cioè,] (http://ideone.com/GKniz) 'String eightChars = unique.substring (28);' –

0
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; 
} 
0

Soluzione rapida e sporca con java.util.UUID:

public String getRandomString(int length) { 
    return UUID.randomUUID().toString().subSequence(0, length); 
} 
+5

L'ho generato due volte e ff808181328864ba01328864bc590000 e ff808181328864ba02328864bc5902300. Se prendo solo 8 primi caratteri, otterrò la stessa stringa :( –

0

Prova seguente codice:

private String uniqid() { 
    Random random = new Random(); 
    String tag = Long.toString(Math.abs(random.nextLong()), 36); 
    return tag.substring(0, 8); 
} 
+0

Credo che questo non * abbastanza * faccia la cosa giusta, perché Long.toString perde gli zeri iniziali.Tuttavia, potresti estendere il codice a zero-pad stringhe corte invece di tagliarle –

+0

Questo id non è 'unique' – Ilya

10

Se l'unicità è importante, non è possibile generare in modo casuale stringhe. Non c'è modo di evitare una collisione. Anche gli UUID possono scontrarsi, sebbene sia alquanto improbabile.

È possibile mantenere un record delle stringhe utilizzate e quando si genera una nuova stringa casuale, controllare il record per vedere se si tratta di un duplicato e, in tal caso, scartarlo e riprovare.

Tuttavia, ciò che vorrei suggerire è che non si generano numeri casuali. Invece, mantieni un contatore e cripta il suo output per produrre numeri dall'aspetto casuale. Questi sono garantiti per non entrare in collisione se lo fai correttamente. Vedere an earlier answer of mine o one by Rossum

2

È possibile creare questa stringa sulla base dell'ora corrente.

Ad esempio:

2014 06 04 16 21 20 79 ---> 06 04 16 14 21 20 79

Poi si può tradurre ogni due cifre (ad eccezione ultimi due) per un carattere alfanumerico utilizzando tabella (http://en.wikipedia.org/wiki/Base64 - notare che tutti sono più piccolo di 59)

quindi si riceverà

14 - O
06 - G
04 - E
16 - Q
21 - V
20 - U

OGEQVU79 < - esattamente 8 caratteri. Un po 'complicato, ma funziona se non chiami la tua funzione più di 0.01 s

0

A questo punto si devono aver ottengono la risposta, ma per coloro che raggiungono questa pagina, provare questo codice:

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; 
} 

}

Qui il l'uso del set garantisce l'unicità mentre l'uso di HashSet garantisce prestazioni migliori durante la lettura e la scrittura.

-2
long unixTime = System.currentTimeMillis()/1000L; 
String unique_no=Long.toHexString(unixTime).toUpperCase(); 

fornisce una stringa di 8 caratteri univoci in formato HEX.

+0

Non unico se chiami più di una volta al secondo, e sicuramente non casuale! –