Я пытаюсь создать уникальный идентификатор в php, чтобы без конфликтов хранить загруженный пользователем контент на FS. Я использую php, и на данный момент этот небольшой фрагмент отвечает за создание UID:
$id = tempnam (".", "");
unlink($id);
$id = substr($id, 2);
Этот код ужасен: он создает временный файл в FS и удаляет его, сохраняя только релевантную уникальную часть сгенерированной строки.
Есть ли лучший способ сделать это, наиболее предпочтительно без каких-либо внешних зависимостей?
Спасибо большое!






uniqid () - это то, что вам нужно в большинстве практических ситуаций.
Вы можете сделать его еще более уникальным, добавив после него большое случайное число.
string uniqid ([ string $prefix [, bool $more_entropy ]] )
Получает уникальный идентификатор с префиксом на основе текущего времени в микросекундах.
USAGE: $id = uniqid(rand(), true);
Я как раз собирался это сказать. У Sha1 меньше коллизий, но проблема с хешированием определенно есть. Помните: чем дольше вы делаете уникальный идентификатор и чем чаще вы делаете что-то «случайное», тем ниже вероятность коллизии.
На самом деле, я вижу, что вы хотите сказать, что вам нужен идентификатор, а не значение токена ... EDITED.
Поскольку и uniqid (), и rand () являются функциями, основанными на текущем времени, rand () почти не добавляет энтропии, так как время будет меняться лишь на небольшую величину между соответствующими вызовами.
Пока вы используете опцию more_entropy, у вас никогда не должно быть конфликтов на одном сервере. Если вы используете кластеризацию, обязательно укажите префикс, который различается между серверами.
Разве хеширование с помощью MD5 не повысит вероятность возникновения коллизий?