Насколько уникален uniqid?


этот вопрос на самом деле не проблема ищет решение, это больше просто вопрос простого любопытства. Функция PHP uniqid имеет более энтропийный флаг, чтобы сделать вывод "более уникальным". Это заставило меня задаться вопросом, насколько вероятно, что эта функция будет производить один и тот же результат более одного раза, когда more_entropy истинно, а не когда это не так. Другими словами, насколько уникален uniqid, когда more_entropy включен, а когда он отключен? Есть ли какие-либо недостатки в наличии more_entropy включен все время?

5 71
php

5 ответов:

Обновление, Март 2014 Года:

во-первых, важно отметить, что uniqid Это немного неправильное название, так как оно не гарантирует уникальный идентификатор.

на PHP документации:

внимание!

эта функция не создает случайную или непредсказуемую строку. Этот функция не должна использоваться в целях безопасности. Использовать криптографически безопасная случайная функция / генератор и криптографически безопасную хэш функции для создания непредсказуемого безопасного идентификатора.

и

эта функция не генерирует криптографически защищенные токены, в факт без передачи каких-либо дополнительных параметров возвращаемое значение мало чем отличается от microtime (). Если вам нужно создать криптографически безопасные токены используют openssl_random_pseudo_bytes ().


настройка more-entropy to true генерирует более уникальное значение, однако время выполнения больше (хотя и в незначительной степени), согласно документам:

если установлено значение TRUE, uniqid () добавит дополнительную энтропию (используя комбинированный линейный конгруэнтный генератор) в конце возврата значение, которое увеличивает вероятность того, что результат будет уникальным.

обратите внимание на строку increases the likelihood that the result will be unique а не то будет гарантия уникальность.

вы можете "бесконечно" стремиться к уникальности, вплоть до точки, и улучшить использование любого количества процедур шифрования, добавив соль и как - это зависит от цели.

Я бы рекомендовал посмотреть комментарии по основной теме PHP, примечательно:

http://www.php.net/manual/en/function.uniqid.php#96898

http://www.php.net/manual/en/function.uniqid.php#96549

http://www.php.net/manual/en/function.uniqid.php#95001

то, что я бы рекомендовал, работает почему вам нужна уникальность, это для безопасности (т. е. для шифрования и скремблирования рутина)? Кроме того,как уникальный это должно быть? Наконец, посмотрите на скорость рассмотрения. Пригодность будет меняться с учетом основных соображений.

вещи уникальны только если вы проверяете, что они еще не существуют. Не имеет значения, какую функцию вы используете для генерации "случайной" строки или идентификатора - если вы не дважды проверяете, что это не дубликат, то всегда есть такой шанс.. ;)

в то время как uniqid основан на текущем времени, предостережение выше все еще применяется - это просто зависит от того, где вы будете использовать эти "уникальные идентификаторы". Ключ ко всему этому-там, где он говорит "более уникальный". Уникальная уникальная уникальная. Как у вас может быть что-то более или менее уникальное, немного запутанное для меня!

проверка, как указано выше, и объединение всех этих вещей позволит вам в конечном итоге получить что-то приближающееся к уникальности, но все это относительно того, где будут использоваться ключи и контекст. Надеюсь, это поможет!

из обсуждения функции на сайте PHP manual:

как другие ниже Примечание, без префикса и без "добавленной энтропии", это функция просто возвращает UNIX метка времени с добавлением микросекунды счетчик в виде шестнадцатеричного числа; это больше или меньше всего microtime (), в форме hexit.

[...]

также стоит отметить, что поскольку microtime () работает только на системах, которые имеют gettimeofday () > present, которые Windows изначально Нет, uniqid () может дать только метку времени UNIX с разрешением одной секунды в среде Windows.

другими словами без "more_entropy", функция абсолютно ужасна и никогда не должна использоваться, точка. Согласно документации, флаг будет использовать "комбинированный линейный конгруэнтный генератор"для" добавления энтропии". Ну, это довольно слабый ГСЧ. Поэтому я бы полностью пропустил эту функцию и использовал что-то на основе mt_rand С хорошим семенем для вещей не относящихся к безопасности, и SHA-256 для вещей, которые.

без флага more_unique он возвращает метку времени unix со счетчиком микросекунд, поэтому, если два вызова выполняются в одну и ту же микросекунду, они вернут тот же "уникальный" идентификатор.

оттуда это вопрос о том, насколько это вероятно. Ответ: не очень, но не до такой степени доступ. Если вы нужно уникальный идентификатор, и вы часто генерируете их (или работаете с данными, сгенерированными в другом месте), не рассчитывайте на то, что он будет абсолютно уникальным.

соответствующий бит от исходный код и

if (more_entropy) {
    uniqid = strpprintf(0, "%s%08x%05x%.8F", prefix, sec, usec, php_combined_lcg() * 10);
} else {
    uniqid = strpprintf(0, "%s%08x%05x", prefix, sec, usec);
}

так more_entropy добавляет несколько случайных десятичных цифр (php_combined_lcg() возвращает значение (0,1)) - это 29,9 бит энтропии, вершины (на самом деле, вероятно, меньше, поскольку LCG не является криптографически безопасным генератором псевдослучайных чисел).