代码之家  ›  专栏  ›  技术社区  ›  YSC

消耗std::random_设备的熵

  •  0
  • YSC  · 技术社区  · 5 年前

    std::random_device 并想检查它的剩余熵。根据cppreference.com:

    std::random_device::entropy

    double entropy() const noexcept;
    

    返回值

    设备熵的值,如果不适用,则为零。

    某些标准库中未完全实现此功能。例如,LLVM libc++始终返回零,即使设备是非确定性的。相比之下,微软Visual C++实现总是返回32,而BooST.Read返回10。

    #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?)

    我希望从设备生成数字会消耗它的熵。但事实并非如此。

    发生了什么事?

    2 回复  |  直到 5 年前
        1
  •  2
  •   David Schwartz    5 年前

    libstd code :

    const int max = sizeof(result_type) * __CHAR_BIT__;
    if (ent > max)
      ent = max;
    

    获取随机数设备熵的估计值,它是介于0和log 2(max()+1)(等于std::numeric_limits::digits)之间的浮点值。

        2
  •  0
  •   Dan M.    5 年前

    你可以看到 .entropy() here .

    entropy() 电话 ioctl(fd, RNDGETENTCNT, &ent) 返回 ent (夹紧后,根据需要在目标类型中设置最大位数)。

    只是碰巧在你死后它没有改变 drain_entropy 呼叫

    即使移除钳制,熵也几乎没有受到影响(甚至可能增加)。