我明白了疯狂地real times
当我运行以下命令时有所不同。
dd if=/dev/random bs=1k count=1
它不会发生在if=/dev/null
,也不会发生在if=/dev/urandom
我已经运行了 500 次了。以下是一般统计数据(每次调用)。时间以秒为单位。
Minimum Maximum Average Median
00.002 89.999 4.50402 2.275
有人对为什么会发生这种情况有任何建议吗?
系统是Ubuntu 10.04桌面版。 Bash 版本是 4.1.5(1)
它也显示了运行相同版本 Ubuntu 的 VirtualBox VM 中类似的剧烈波动。
这是实际的测试代码
cp /dev/null "$HOME/dd-random.secs"
for ((i=100;i<=500;i++)); do
if ((i<10)) ;then zi="00$i"
elif ((i<100)) ;then zi="0$i"
else zi="$i"
fi
echo -ne "$zi\t" >>"$HOME/dd-random.secs"
exec 3>/dev/null 4>/dev/null
{ time { dd if=/dev/random bs=1k count=1; } 1>&3 2>&4; } 2>&1 |tail -n 3|tr 'm\n' '\t' |sed -re "s/([0-9])s/\1/g" >>"$HOME/dd-random.secs"
exec 3>&- 4>&-
echo >>"$HOME/dd-random.secs"
done
答案1
这正是/dev/random
和之间的区别/dev/urandom
-random
使用熵池,它从一堆来源收集噪声并跟踪池中当前“有多少”噪声,因此random
知道它可以生成多少高质量随机性。由于熵池的噪声量有限,因此random
如果没有足够的可用熵,则可能需要阻塞读取。urandom
永远不会阻塞,但您可能会从中获得“不太随机”的数据。
从random(4)
手册页:
读取时,/dev/random 设备将仅返回熵池中估计的噪声位数内的随机字节。 /dev/random 应该适合需要非常高质量随机性的用途,例如一次性密码本或密钥生成。当熵池为空时,从 /dev/random 读取将被阻塞,直到收集到额外的环境噪声。
从 /dev/urandom 设备读取不会阻塞等待更多熵。因此,如果熵池中没有足够的熵,则返回的值理论上很容易受到驱动程序使用的算法的加密攻击。
答案2
从http://en.wikipedia.org/wiki//dev/random#Linux:
“当熵池为空时,从 /dev/random 读取数据将被阻塞,直到收集到额外的环境噪音。”
编辑:看起来迈克尔比我先一步!