C 每次阅读我都必须重新打开/dev/uradom吗?
我有一个服务器在一个永久循环中运行。每隔一段时间,服务器必须执行密码哈希(更具体地说,每次用户注册我的服务时)。散列算法需要一个salt,16个随机字节,我从C 每次阅读我都必须重新打开/dev/uradom吗?,c,linux,random,password-hash,C,Linux,Random,Password Hash,我有一个服务器在一个永久循环中运行。每隔一段时间,服务器必须执行密码哈希(更具体地说,每次用户注册我的服务时)。散列算法需要一个salt,16个随机字节,我从/dev/uradom中读取,这是许多人推荐的 所以我想:为什么不在服务器启动时只调用一次fopen(“/dev/uradom”,“rb”),然后根据需要调用fread 我在网上找到的例子通常显示fread,前面紧跟着fopen。但是这不是很昂贵吗?/dev/uradom是内核熵驱动随机数生成器的接口。它有一个手册页,你可以在本地找到。通过
/dev/uradom
中读取,这是许多人推荐的
所以我想:为什么不在服务器启动时只调用一次fopen(“/dev/uradom”,“rb”)
,然后根据需要调用fread
我在网上找到的例子通常显示
fread
,前面紧跟着fopen
。但是这不是很昂贵吗?/dev/uradom
是内核熵驱动随机数生成器的接口。它有一个手册页,你可以在本地找到。通过fopen()
打开它对随后可以读取的数据没有记录的影响。没有记录在案的对每次打开一次读取的限制,这样的限制也不合理
所以我想:为什么不一次只调用fopen(“/dev/uradom”,“rb”)
启动服务器,然后根据需要调用fread
你可以这样做。主要的成本是您将流程中有限数量的打开文件中的一个永久用于此目的,但这对您来说可能不是问题
我在网上找到的例子通常显示fread前面紧跟着fopen。但是那不是很贵吗
打开一个文件相对来说比较昂贵,特别是当它已经打开,因此什么也不做时,但是它是否足够昂贵,这取决于它执行的频率、程序在同一时间或大约同时执行的其他操作以及其他因素。然而,我倾向于认为这些都不是你的网络示例真正需要考虑的,因为我判断这些示例的呈现至少部分是出于教学目的。如果您正在编写一个示例,那么显示
fopen()
要比用文字描述您正在使用的文件连接到/dev/uradom
更容易、更清楚:现在我会使用它,但您可以这样做。当然,可能会遇到stdio缓冲的问题(我不知道glibc是否专门处理设备文件)<如果您想从随机设备读取,则code>open()
和read()
通常更好。使用新的open或相同的句柄即可。通过保留句柄,可以节省fopen
的开销。