Пишу API для онлайн-игры. Требуется сгенерировать токен игрока из 30 знаков (только цифры и английские буквы). Как это сделать правильно и быстро?
Для начала как не надо делать. Не используйте для генерации mt_rand()
или тем более rand()
если вам нужны уникальные строки.
Идеологически более правильный подход - чтение исходной "энтропии" из /dev/random
или /dev/urandom
. Их конечно же нету в Windows, но я надеюсь вы не станете хостить проект на PHP в Windows (для этой оси есть более подходящая платформа). Для теста можно сделать и заглушку на mt_rand()
.
Еще более надежный вариант random_bytes()
(но он есть только начиная с PHP7) или openssl_random_pseudo_bytes()
(5.3+)
Чтобы получить нужные вам символы, можно:
перевести исходную строку байт из системы счисления 256 в систему счисления с нужным вам алфавитом. Этот вариант не потеряет характеристики распределения исходной строки, но немного сложнее в реализации;
перевести грубым сопоставлением 1байт - 1символ. Допустим для вашего варианта (цифры и буквы) можно брать остаток от деления каждого байта на 36 (это количество символов в вашем алфавите) и по полученному индексу брать символ из набора допустимых (это может быть строка из цифр и букв, или пара if
'ов). При этом варианте вероятность появления разных символов будет неравномерной, но это может оказаться не важно;
отказаться от варианта цифры и все английские буквы и оставить только [0-9a-f] - то есть просто перевести строку в шестнадцатеричный вид. Также сохранятся характеристики "случайности", но это несколько противоречит вашим исходным условиям.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть локальный сервер$_SERVER['REMOTE_ADDR'] почему-то дает результат "::1" вместо нормального "127