我每次阅读都必须重新打开 /dev/urandom 吗?

Do I have to reopen /dev/urandom every read?

我有一个永远循环的服务器 运行。每隔一段时间,服务器就必须对密码进行哈希处理(更具体地说,每次用户注册我的服务时)。哈希算法需要一个 salt,16 个随机字节,这是我从 /dev/urandom 中读取的,正如许多人所推荐的那样。

所以我想:为什么不在服务器启动时只调用一次 fopen("/dev/urandom", "rb"),然后根据需要调用 fread

我在网上找到的示例通常显示 fread 紧接着 fopen。但是不是很贵吗?

/dev/urandom 是内核的熵驱动随机数生成器的接口。它有一个手册页,您可以在 online 中找到它,也可能在本地找到它。通过 fopen() 打开它对随后可以读取的数据没有记录影响。没有记录每次打开一次读取的限制,这样的限制也不合理。

So I thought: why not call fopen("/dev/urandom", "rb") only once at the start of the server and then call fread as I need?

你可以这样做。主要成本是您将进程中有限数量的打开文件中的一个永久地用于此目的,但这对您来说可能不是问题。

The examples I found in the web usually shows fread immediately preceded by fopen. But isn't that expensive?

打开一个文件的成本相对较高,尤其是已经打开文件但什么都不做的情况下,但它的成本是否足够重要取决于打开的频率、程序可能正在做的其他事情或大约在同一时间,以及其他因素。我倾向于认为其中的 none 确实是您的 Web 示例的考虑因素,但是,因为我认为它们的呈现至少部分是出于教学目的。如果您正在编写一个示例,那么显示 fopen() 比用文字描述您正在使用的 FILE 连接到 /dev/urandom.[=20 更容易和更清楚=]