Как сгенерить токен в php?

442
04 апреля 2017, 13:08

Пишу API для онлайн-игры. Требуется сгенерировать токен игрока из 30 знаков (только цифры и английские буквы). Как это сделать правильно и быстро?

Answer 1

Для начала как не надо делать. Не используйте для генерации mt_rand() или тем более rand() если вам нужны уникальные строки.

Идеологически более правильный подход - чтение исходной "энтропии" из /dev/random или /dev/urandom. Их конечно же нету в Windows, но я надеюсь вы не станете хостить проект на PHP в Windows (для этой оси есть более подходящая платформа). Для теста можно сделать и заглушку на mt_rand().

Еще более надежный вариант random_bytes() (но он есть только начиная с PHP7) или openssl_random_pseudo_bytes() (5.3+)

Чтобы получить нужные вам символы, можно:

  1. перевести исходную строку байт из системы счисления 256 в систему счисления с нужным вам алфавитом. Этот вариант не потеряет характеристики распределения исходной строки, но немного сложнее в реализации;

  2. перевести грубым сопоставлением 1байт - 1символ. Допустим для вашего варианта (цифры и буквы) можно брать остаток от деления каждого байта на 36 (это количество символов в вашем алфавите) и по полученному индексу брать символ из набора допустимых (это может быть строка из цифр и букв, или пара if'ов). При этом варианте вероятность появления разных символов будет неравномерной, но это может оказаться не важно;

  3. отказаться от варианта цифры и все английские буквы и оставить только [0-9a-f] - то есть просто перевести строку в шестнадцатеричный вид. Также сохранятся характеристики "случайности", но это несколько противоречит вашим исходным условиям.

READ ALSO
Проблема с $_SERVER['REMOTE_ADDR']

Проблема с $_SERVER['REMOTE_ADDR']

Есть локальный сервер$_SERVER['REMOTE_ADDR'] почему-то дает результат "::1" вместо нормального "127

331
Laravel посчитать количество отношений

Laravel посчитать количество отношений

Задача следующая - я делаю выборку из модели

346
Ошибка миграции

Ошибка миграции

Таблица users

274