Генерация токенов, случайных строк, уникальных строковых идентификаторов встречается очень часто среди задач. Как ни странно все выполняют ее тоже «уникально».
Часто на форумах или сторонних исходных кодах я видел дпримерно следующую реализацию поставленной задачи:
$token = md5( time() . rand(0, rand(100, 10000)) ) ;
Да, поставленную задачу такой подход выполняет и с большой долей вероятости результат будет уникальным. Но в php есть более нативный, простой и быстрый метод. Это метод uniqid.
Этот метод генерирует уникальную строку длиной в 13 символов, основываясь на процессорном времени. Например:
// случайный токен echo uniqid(); /* результат 4bd67c947233e */ // повторно echo uniqid(); /* в результате 4bd67c9472340 */
Визуально результирующие строки похожи и это связано именно с работой с процессорным временем и разницей во времени вызова. Чтобы увеличить степень уникальности используйте необязательные параметры метода uniqid.
Первый из них — $prefix — строка, добавляемая перед токеном. При работе на разных поддоменах с вероятностью запуска в одну микросекунду можно подстраховаться указанием этого параметра.
Второй — more_entropy — добавление дополнительной энтропии в конец токена. Передача true будет означать увеличение длины строки на 10 символов — с 13 до 23.
Но, в любом случае, как по мне, использование этого метода, даже со всеми дополнительными параметрами является более приемлдемым.