PHP - uniqid ("", true) против uniqid ("") + mt_rand () - PullRequest
1 голос
/ 31 марта 2011

Каковы основные различия между этими двумя подходами для генерации последовательных, но несколько уникальных чисел?Я хочу использовать такое число в качестве уникального идентификатора пользователя в базе данных MySQL, а также в качестве соли для подсчета пароля.

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

Ответы [ 2 ]

5 голосов
/ 31 марта 2011

Без использования дополнительной энтропии uniqid делает в основном следующее (см. источник uniqid.c ):

$time = explode(' ', microtime(false));
return sprintf('%s%08x%05x', $prefix, $time[1], $time[0] * 1000000);

Таким образом, оно в основном берет текущее время в микросекундах, превращает их в шестнадцатеричное представление и добавляет к префиксу. Это уже предоставляет уникальные значения.

Но значения не совсем случайные. Чтобы получить больше случайных значений, вы должны добавить больше энтропии, установив второй параметр more_entropy . В этом случае внутренний линейный конгруэнтный генератор PHP php_combined_lcg (см. источник lgc.c ) используется для генерации псевдослучайного числа, которое присоединяется в конец, добавляя около 30 бит дополнительной энтропии, чтобы сделать их более случайными.

2 голосов
/ 31 марта 2011

(вычеркните это, неверная информация, извините)

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

Этот вариант по-прежнему сохраняется: если вам нужны уникальные последовательные числа, и вы используете MySQL, используйте поле автоинкремента, они просточто.

...