【发布时间】:2018-12-27 12:03:48
【问题描述】:
我正在使用std::random_device 并想检查它的剩余熵。根据 cppreference.com:
std::random_device::entropydouble entropy() const noexcept;[...]
返回值
设备熵的值,如果不适用,则为零。
注意事项
此功能在某些标准库中未完全实现。例如,即使设备是不确定的,LLVM libc++ 也总是返回零。相比之下,Microsoft Visual C++ 实现总是返回 32,而 boost.random 返回 10。
Linux 内核设备 /dev/urandom 的熵可以使用 ioctl RNDGETENTCNT 获得 - 这是 GNU libstdc++ 中的 std::random_device::entropy() 从 8.1 版开始使用的内容
所以在 Linux ang g++ >= 8.1 下,我应该很好……但我不是:
#include <random>
#include <iostream>
void drain_entropy(std::random_device& rd, std::size_t count = 1)
{
while (count --> 0) {
volatile const int discard = rd();
(void) discard;
}
}
int main()
{
std::random_device rd;
std::cout << "Entropy: " << rd.entropy() << '\n'; // Entropy: 32
drain_entropy(rd, 1'000'000);
std::cout << "Entropy: " << rd.entropy() << '\n'; // Entropy: 32
}
Live demo on Coliru (which runs under Linux, right?)
我预计从设备生成数字会消耗其熵。但事实并非如此。
发生了什么事?
【问题讨论】:
-
仅仅因为 Linux 内核支持在其随机数生成器中查询剩余熵并不意味着 1) C++ 库使用内核的随机数生成器,和/或 2) C++ 库有意义地实现返回剩余的熵。
-
@Sam cppreference 声称 1) 和 2) 是正确的。
-
@YSC 有什么问题?我在这里看不到任何东西。
-
@DanM。我期待从设备生成的数字会消耗它的熵。它没有。 (Q 固定)
-
@YSC 为什么您认为读取 100 万个整数会以任何有意义的方式减少它?它的生成速度可能比这更快。在我的本地机器上,我必须开始耗尽
10^10的字节,以使其以有意义的方式减少。