Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как сгенерировать случайную строку

Короткий ответ

Выбирайте случайные символы из строки-алфавита. Для паролей и токенов используйте 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.