#php #guid #unique #uuid #identifier
Вопрос:
Я пытаюсь сгенерировать уникальный идентификатор в php, чтобы хранить загруженный пользователем контент в FS без конфликтов. Я использую php, и на данный момент этот небольшой фрагмент отвечает за создание UID:
$id = tempnam (".", "");
unlink($id);
$id = substr($id, 2);
Этот код отвратителен: он создает временный файл в FS и удаляет его, сохраняя только соответствующую уникальную часть сгенерированной строки.
Есть ли лучший способ сделать это, наиболее предпочтительно без каких-либо внешних зависимостей?
Большое спасибо!
Ответ №1:
string uniqid ([ string $prefix [, bool $more_entropy ]] )
Получает уникальный идентификатор с префиксом, основанный на текущем времени в микросекундах.
USAGE: $id = uniqid(rand(), true);
Комментарии:
1. разве хеширование его с помощью MD5 на самом деле не повысит вероятность возникновения коллизий?
2. Я как раз собирался это сказать. В Sha1 меньше коллизий, но в хешировании определенно есть эта проблема. Помните: чем дольше вы создаете уникальный идентификатор и чем больше раз вы делаете с ним что-то «случайное», тем ниже вероятность столкновения.
3. На самом деле, я вижу, вы правы, вам нужен идентификатор, а не значение токена… отредактированный.
Ответ №2:
Поскольку и uniqid (), и rand() являются функциями, основанными на текущем времени, функция rand() почти не добавляет энтропии, поскольку время между соответствующими вызовами изменится незначительно.
Пока вы используете эту more_entropy
опцию, у вас никогда не должно быть конфликтов на одном сервере. Если вы используете кластеризацию, обязательно укажите префикс, который отличается между серверами.
Ответ №3:
uniqid () — это то, что вы ищете в большинстве практических ситуаций.
Вы можете сделать его еще более «uniq», добавив после него большое случайное число.