8 символов уникальная строка в Java - PullRequest
9 голосов
/ 17 октября 2011

Есть ли способ генерировать случайную и уникальную строку длиной 8 символов в Java?

String id = getRandomString();

и тогда Id будет, например, wf41Av5g

Ответы [ 9 ]

23 голосов
/ 17 октября 2011

Вы можете использовать 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));

  }
}
11 голосов
/ 17 октября 2011

Если важна уникальность, вы не можете просто генерировать строки случайным образом. Нет способа избежать столкновения. Даже UUID могут сталкиваться, хотя это маловероятно.

Вы можете хранить записи о тех строках, которые вы использовали, и когда вы генерируете новую случайную строку, проверьте запись, чтобы увидеть, является ли она дубликатом, и если да, отбросьте ее и попробуйте снова.

Однако я бы сказал, что вы не генерируете случайные числа. Вместо этого сохраните счетчик и зашифруйте его вывод, чтобы получить случайные числа. Они гарантированно никогда не столкнутся, если вы сделаете это правильно. См. мой предыдущий ответ или один от Россума

11 голосов
/ 17 октября 2011

Свойство уникальность зависит от области, в которой вы его используете. Java, безусловно, может генерировать случайные строки, хотя, если вам нужен универсальный уникальный идентификатор , вы можете использовать класс UUID.

String unique = UUID.randomUUID().toString();
2 голосов
/ 04 июня 2014

Вы можете создать эту строку на основе текущего времени.

Например:

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

Затем вы можете перевести каждые две цифры (кроме последних двух) для буквенно-цифрового символа, используя таблицу (http://en.wikipedia.org/wiki/Base64 - обратите внимание, что все они меньше 59)

тогда вы получите

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

OGEQVU79 <- ровно 8 символов. Немного сложно, но это работает, если вы не будете часто вызывать свою функцию, чем 0,01 с </p>

0 голосов
/ 21 февраля 2018
long unixTime = System.currentTimeMillis() / 1000L;
String unique_no=Long.toHexString(unixTime).toUpperCase();

дает вам уникальную строку из 8 символов в формате HEX.

0 голосов
/ 01 марта 2017

К настоящему времени вы, должно быть, получили свой ответ, но для тех, кто достигает этой страницы, попробуйте этот код:

открытый класс 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;
} 

}

Здесь использование set гарантирует уникальность, а использование HashSet обеспечивает лучшую производительность при чтении и записи.

0 голосов
/ 17 октября 2011

Пожалуйста, попробуйте следующий код:

private String uniqid() {
    Random random = new Random();
    String tag = Long.toString(Math.abs(random.nextLong()), 36);
    return tag.substring(0, 8);
}
0 голосов
/ 17 октября 2011

Быстрое и грязное решение с использованием java.util.UUID :

public String getRandomString(int length) {
    return UUID.randomUUID().toString().subSequence(0, length);
}
0 голосов
/ 17 октября 2011
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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...