为什么读取/dev/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

但是,如果/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。

最新更新