Как сгенерировать случайную строку
Короткий ответ
Выбирайте случайные символы из строки-алфавита. Для паролей и токенов используйте SecureRandom — его результат нельзя предсказать:
static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
static final SecureRandom RANDOM = new SecureRandom();
String randomString(int length) {
var result = new StringBuilder(length);
for (int i = 0; i < length; i++) {
result.append(ALPHABET.charAt(RANDOM.nextInt(ALPHABET.length())));
}
return result.toString();
}
void main() {
IO.println(randomString(12));
}Результат:
G0fHdMG1t29TРезультат каждый раз разный.
Токен из байтов
Для длинных токенов удобнее взять случайные байты и закодировать их в Base64 для адресов:
void main() {
byte[] bytes = new byte[24];
new SecureRandom().nextBytes(bytes);
IO.println(Base64.getUrlEncoder().withoutPadding().encodeToString(bytes));
}Результат:
odBXRC78P41xba6fnFUZf53ovW79tmulУникальный идентификатор
Если нужен просто уникальный ID, используйте UUID:
void main() {
IO.println(UUID.randomUUID());
}Результат:
26d2e800-7d9e-48cd-b6bf-6645d141f886Повторяемый результат
Для тестов бывает нужна одинаковая «случайная» строка. Random с фиксированным начальным числом (seed) каждый раз выдаёт одну и ту же последовательность:
void main() {
var random = new Random(42);
var result = new StringBuilder();
for (int i = 0; i < 6; i++) {
result.append((char) ('a' + random.nextInt(26)));
}
IO.println(result);
}Результат:
ahwmarЧастая ошибка
Генерировать пароли и токены через Random или Math.random(). Их последовательность можно восстановить по нескольким значениям. Для всего, что связано с безопасностью, нужен SecureRandom.
Функции из этого ответа
- Random — Генератор случайных чисел: целые в диапазоне, дробные, boolean.
- StringBuilder.append() — Добавляет значение в конец StringBuilder.