uniqid()
Функция PHP uniqid(): описание, синтаксис, параметры и примеры использования. Узнайте, когда её применять, а когда предпочесть random_bytes().
Функция PHP uniqid() генерирует строковый идентификатор на основе текущего времени в микросекундах. На этой странице описаны её синтаксис и параметры, как выглядит возвращаемое значение, важное предупреждение о том, что она не подходит для токенов безопасности, и что использовать вместо неё.
Что делает uniqid()
uniqid() возвращает 13-символьную шестнадцатеричную строку, основанную на текущем системном времени с точностью до микросекунды. Поскольку часы постоянно идут вперёд, два вызова, сделанных даже с разницей в долю секунды, обычно дают разные значения — это делает функцию удобной для низкорисковых идентификаторов: временных имён файлов, ключей кэша или атрибутов id у DOM-элементов.
Это временно́й идентификатор, а не случайный. Это важное различие: значение предсказуемо, и на быстрой машине два вызова в одну микросекунду вернут одну и ту же строку. Имейте это в виду, рассчитывая на уникальность, — и никогда не используйте функцию там, где нужна секретность.
Синтаксис
uniqid(string $prefix = "", bool $more_entropy = false): string| Параметр | Тип | Описание |
|---|---|---|
$prefix | string | Текст, добавляемый перед возвращаемым идентификатором. Полезен, если несколько хостов или процессов могут генерировать идентификаторы в одно и то же мгновение. По умолчанию — пустая строка. |
$more_entropy | bool | При значении true добавляет дополнительные символы, снижающие вероятность коллизий. По умолчанию — false. |
Возвращаемое значение: строка. При аргументах по умолчанию длина составляет 13 символов; при $more_entropy, равном true — 23 символа (длина префикса добавляется поверх обоих вариантов).
Базовое использование
Вызовите uniqid() без аргументов, чтобы получить простой идентификатор на основе временно́й метки:
Возвращаемый $id содержит 13 шестнадцатеричных символов. При каждом запуске выводится другое значение, поскольку временна́я метка в микросекундах сдвинулась.
Добавление префикса
Передайте строку в качестве первого аргумента, чтобы добавить её перед идентификатором. Это помогает различать идентификаторы, генерируемые в разных частях приложения или на разных серверах:
Префикс не является случайным — он добавляется как есть — и сам по себе не повышает уникальность. Его задача — разграничивать пространство имён идентификатора.
Дополнительная энтропия
В интенсивном цикле временна́я метка может повторяться, что ведёт к дублированию идентификаторов. Установка второго аргумента в true добавляет дополнительные символы (на основе комбинированного линейного конгруэнтного генератора), снижая этот риск:
При включённом $more_entropy результат составляет 23 символа. Это снижает вероятность коллизий, но не делает значение непредсказуемым.
Важно: uniqid() небезопасна
Это самая распространённая ошибка при использовании uniqid(). Поскольку значение получается из часов, злоумышленник, знающий примерное время создания идентификатора, может его угадать. Никогда не используйте uniqid() для:
- токенов сброса пароля или «магических ссылок»
- идентификаторов сессий или ключей API
- токенов CSRF или любых других значений, важных для безопасности
Для всего, что должно быть непредсказуемым, используйте криптографически защищённый источник. random_bytes() (PHP 7+) — правильный инструмент, при необходимости его результат можно преобразовать в читаемую строку с помощью bin2hex():
<?php
// 32-character, cryptographically secure random token
$token = bin2hex(random_bytes(16));
echo "Secure token: " . $token . "\n";
// e.g. Secure token: 93261fb1d3d843e8dac1d3372b4f3306
?>Если вам нужен глобально уникальный идентификатор в стандартном формате, UUID (через библиотеку, например ramsey/uuid), как правило, подходит лучше, чем uniqid().
Когда стоит использовать uniqid()
uniqid() хорошо подходит, когда нужна быстрая временная метка-идентификатор и небольшой риск коллизий допустим:
- временные имена файлов для загрузки или кэша
- уникальные атрибуты
idв HTML, генерируемые на стороне сервера - недолговечные ключи в кэшах, не критичных для безопасности
Для непредсказуемых секретов используйте random_bytes(); для генерации случайных чисел общего назначения смотрите mt_rand() и rand(); а если вам нужна только базовая высокоточная временна́я метка, обратитесь к microtime().
Итоги
Функция uniqid() генерирует 13-символьный (или 23-символьный при $more_entropy) идентификатор из текущей временно́й метки в микросекундах. Она удобна для нечувствительных идентификаторов с низкой вероятностью коллизий, однако по своей природе предсказуема — для токенов безопасности всегда предпочитайте random_bytes(). Правильный выбор инструмента обеспечит вашим идентификаторам достаточную уникальность, а там, где это важно, — полную непредсказуемость.