Создание уникального идентификатора в PHP

#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», добавив после него большое случайное число.