Генерация случайной строки указанной длины, которая содержит только указанные символы (в Java)

Кто-нибудь знает хороший способ генерации случайной строки заданной длины и символов в Java.

Например, длина может быть 5, а возможные символы могут быть a,b,c,1,2,3,!.

Так

c!a1b действителен

НО

cba16 нет.

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

Есть идеи?

4 ответа

Решение

Вы хотите что-то подобное?

Random r=new Random();

char[] possibleChars="abc123!".toCharArray();
int length=5;

char[] newPassword=new char[length];

for (int i=0; i<length;i++)
    newPassword[i]=possibleChars[r.nextInt(possibleChars.length)];

System.out.println(new String(newPassword));

Код для этого довольно короткий. Имейте char[] или String с N допустимыми символами, и, раз, выберите случайное число R от 0 до N-1, используйте R, чтобы выбрать символ для добавления к вашей сгенерированной строке.

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

Это не так часто, и подробные требования каждый раз разные. Кроме того, код прост до такой степени, что он тривиален. (По модулю проблемы ниже... которые на самом деле о требованиях, а не о решении.)

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


Когда вы используете схему, которая включает в себя случайные числа, вы должны знать о возможности столкновения; то есть метод будет генерировать одну и ту же случайную строку более одного раза. Вы можете уменьшить это, используя более длинную строку, но это работает только до определенной точки... в зависимости от вашего генератора случайных чисел. (Типичные генераторы случайных чисел на самом деле являются генераторами псевдослучайных чисел и производят последовательность чисел, которая в конечном итоге циклически повторяется. И даже при совершенном генераторе случайных чисел существует конечная вероятность повторений в короткой последовательности.)

На самом деле, это еще одна причина, по которой решение вашей проблемы "один размер подходит всем" не является хорошей идеей.

Если это для реальной безопасности, в отличие от домашней работы или упражнения по программированию, используйте SecureRandom, а не Random.

На сайте Diceware вы найдете много хороших идей о случайной генерации паролей и других вещах.

Другие вопросы по тегам