为什么经常读取/ dev / random逐字节块?

时间:2014-03-27 11:39:36

标签: linux shell random

以下调用快速返回:

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

但是,如果{1}}一个接一个地读取:

/dev/random

循环读取几个字节,然后阻塞几秒钟,然后读取另外几个字节。在键盘上键入随机字符可以大大加快这个过程,就像随机池中没有足够的熵一样。完成所有循环后需要很长时间才能完成。

什么使得逐字节读取for i in {1..500}; do dd if=/dev/random bs=1 count=1 status=none; done 比从中读取块慢得多?

Uname -a:

/dev/random

2 个答案:

答案 0 :(得分:2)

答案在于你的问题:

49 bytes (49 B) copied, 0.000134028 s, 366 kB/s

所以它没有像告诉它那样复制1024个字节但只有少数然后停止。我认为这与它在阻止之前在循环中获得的数量相同。

/ dev / random很慢,因为它需要从不同来源收集随机性,只要没有可用,它就不会输出任何东西。

如果您需要更快的数字,请使用/ dev / urandom。

答案 1 :(得分:1)

除非您非常需要/dev/random,否则您应该使用/dev/urandom

当您在池中没有足够的熵来为请求提供服务时,您注意到/dev/random阻止,但如果没有足够的话,urandom将回退到PRNG。< / p>