使用/ dev/random文件io需要太长时间

yua*_*uan 5 c++

我想写一个程序来使用/dev/randomlinux 生成真正随机的数字,但后来我发现它的运行时间偶尔是不可接受的.它的C版本运行速度一致.

#include <iostream>
#include <fstream>
using namespace std;
int main(int argc,char*argv[])
{
    ifstream random("/dev/random", ios_base::in);
    int t;
    random.read(reinterpret_cast<char*>(&t), sizeof(t));
    cout << t << endl;
    random.close();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行时间的时间统计

$: time ./random 
-1040810404

real    0m0.004s
user    0m0.000s
sys 0m0.000s

$: time ./random 
-1298913761

real    0m4.119s
user    0m0.000s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)

Bri*_*ain 7

你可能已经耗尽了熵池.创建(好收获)熵是基于设备驱动程序,它们对物理世界的质量进行抽样,这些质量大多是不可预测的.但是,如果这些设备不是非常活跃或者熵产生算法停止,那么您的读取/dev/random也会停止.

你能用/dev/urandom吗?如果没有,你应该研究一下你能以更确定的方式产生更多熵的方法.

以下是一篇关于类似问题文章的一些建议:

  • 让像AED这样的音频熵守护进程使用开放式麦克风收集数据中心的噪音,或者将其与VED等网络摄像头噪音收集器结合使用.其他消息来源正在谈论"磁盘设备中空气湍流的密码随机性".:)
  • 使用Entropy Gathering Daemon从用户空间程序的随机性中收集较弱的熵.

  • 此外,默认情况下缓存`std :: ifstream`,因此很可能程序的每次运行都试图将几KB的数据读入文件缓冲区,这将使熵池的数量级比读取4的数据级更快.每次运行程序的字节数. (3认同)