下面的调用返回快速:
time dd if=/dev/random bs=1024 count=1
.... 0+1 records in
0+1 records out
49 bytes (49 B) copied, 0.000134028 s, 366 kB/s
real 0m0.004s
user 0m0.001s
sys 0m0.002s
但是,如果/dev/random
被一个字节一个字节地读取:
for i in {1..500}; do dd if=/dev/random bs=1 count=1 status=none; done
循环读取几个字节,然后阻塞几秒钟,然后再读取几个字节。在键盘上输入随机字符大大加快了这个过程,就像在随机池中没有足够的熵一样。毕竟这个循环要花很多分钟才能完成。
为什么一个字节一个字节地读取/dev/random
比从它读取一个块慢得多?
Uname -:
Linux ... 2.6.32-431.11.2.el6.centos.plus.x86_64
答案就在你的问题中:
49 bytes (49 B) copied, 0.000134028 s, 366 kB/s
所以它没有像告诉它的那样复制1024字节,而是只复制了几个字节,然后停止。我猜这和你在循环阻塞之前得到的量是一样的。
/dev/random很慢,因为它需要从不同的来源收集随机性,只要没有可用的,它就不会输出任何东西。
如果你需要更快的数字,请使用/dev/urandom
除非您确实需要/dev/random
,否则您应该使用/dev/urandom
。
正如你所注意到的,当池中没有足够的熵来服务请求时,/dev/random
会阻塞,但是如果没有足够的熵,urandom
会退回到PRNG。