Откуда /dev /urandom собирает эти переменные.
Везде это может, в первую очередь, прерывать время. Например, если у вас есть сетевая карта, точное время прибытия пакета будет зависеть от смещения между временной базой данных кристалла на сетевой карте и временной частотой кристалла, которая синхронизирует ЦП. Смещение между двумя кварцевыми кварцевыми генераторами зависит от изменений температуры микроскопической зоны, которые считаются действительно физически случайными.
Если у вас есть вращающийся диск, время чтения завершится, зависит от скорости вращения диска. Это зависит от турбулентного сдвигающего усилия между поверхностью диска и воздухом внутри дискового узла. Хотя это не считается истинной физической случайностью, это абсолютно непредсказуемо или повторяется любым известным механизмом.
И если у вас есть две машины, настроенные на одно и то же время (вплоть до миллисекунды, если это возможно), и имеют одинаковую скорость, ОС и т. Д ... и возьмете шестнадцатеричный дамп /dev /random с числом X байтов, они такое же точное значение (потому что время было одинаковым)?
Ну, миллисекунда не будет достаточно хороша. Вы должны быть на том же уровне, на котором процессор измеряет время - миллиардные доли секунды. Но, конечно, так и должно быть. В противном случае, если вы увидели состояние одной машины, вы могли бы знать со 100% уверенностью, что другая машина не может иметь то же состояние. А так как состояние должно быть случайным, вы не должны иметь возможность смотреть на любую другую машину и знать что-либо о состоянии со 100% уверенностью. Пока шансы, что это может быть достигнуто, достаточно низки (скажем, меньше, чем один на 2 ^ 100), тогда это прекрасно.
Даже если вы бросите два кубика, каждый с миллиардом сторон, они могут подойти одинаково. Если они делают это только раз в миллиард раз, то так и должно быть.