тут подумал, а что если сделать так md5(uniqid(random()))
посчитаешь энтропию?
Считаем вместе. Во-первых, где ты в РНР нашел функцию
random()? Предположим, что имелась ввиду функция
rand(), которая генерирует псевдослучайное число из равномерно распределенного множества целых чисел. Для простоты вычислений предположим, что мощность (количество элементов) этого множества равна
N = 2^32 = 4294967296 и функция
rand() генерирует равномерно распределенную последовательность истинно случайных чисел. Энтропия такого генератора равна
H1 = log(N) = log(2^32) = 32 бит. На самом деле энтропия всех детерменированных генераторов псевдослучайных чисел заведомо меньше энтропии генераторов равномерно распределенной случайной последовательности (например, аппаратных) и неуклонно стремится к нулю при увеличении длины генерируемой последовательности.
Далее ты предлагаешь воспользоваться функцией
uniqid(), которая возвращает 13-разрядное hex число, основанное на текущем времени с точностью до микросекунд. Для простоты вычислений также предположим, что все 13-разрядные hex-числа имеют равную вероятность появления (что, конечно же, совсем не так). Тогда ее энтропия равна
H2 = log(16^13) = 52 бит, а энтропия функции
uniqid(rand()) равна
H3 = H1 + H2 = 32 + 52 = 84 бит. Это выражение справедливо только в том случае, если значения, возвращаемые функциями
uniqid() и
rand(), некоррелированны (что, тоже, не совсем так).
Ну, и наконец, ты воспользовался 128-битной хэш-функцией
md5(). Она полностью детерменированна и необратима, поэтому может только уменьшить энтропию передаваемого ей аргумента.
Итого - в идеальном случае энтропия предложенного генератора равна 84 бит. На самом деле она намного ниже вследствие сделанных выше допущений.