PHP – uniqid ("", true) против uniqid ("") + mt_rand ()

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

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

(поцарапать это, неверная информация, извините)

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

Это все еще сохраняется: если вам нужны уникальные порядковые номера, и вы используете MySQL, используйте поле auto increment, они делают именно это.

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

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

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

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