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
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
È 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));
}
}
Sono curioso, come si risolve la domanda dell'OP.Non vedo nulla nella documentazione che assicuri l'unicità – taylorcressy
Sono anche curioso di questo. –
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();
È buono ma ho bisogno solo di 8 caratteri, altrimenti lo userei senza e dubbio. –
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. –
@danny, [cioè,] (http://ideone.com/GKniz) 'String eightChars = unique.substring (28);' –
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;
}
Soluzione rapida e sporca con java.util.UUID:
public String getRandomString(int length) {
return UUID.randomUUID().toString().subSequence(0, length);
}
L'ho generato due volte e ff808181328864ba01328864bc590000 e ff808181328864ba02328864bc5902300. Se prendo solo 8 primi caratteri, otterrò la stessa stringa :( –
Prova seguente codice:
private String uniqid() {
Random random = new Random();
String tag = Long.toString(Math.abs(random.nextLong()), 36);
return tag.substring(0, 8);
}
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 –
Questo id non è 'unique' – Ilya
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
È 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
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.
long unixTime = System.currentTimeMillis()/1000L;
String unique_no=Long.toHexString(unixTime).toUpperCase();
fornisce una stringa di 8 caratteri univoci in formato HEX.
Non unico se chiami più di una volta al secondo, e sicuramente non casuale! –
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
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