利用沙桥的硬件真随机数发生器?

时间:2011-10-26 11:13:44

标签: c++ numbers hardware generator intel

我想知道是否有办法利用英特尔沙桥CPU中的新硬件真数发生器?我读到英特尔的MKL(数学内核库)公开了这个功能,但这需要MKL套件和英特尔编译器,结果非常昂贵。

我的C ++代码中是否有另一种使用硬件随机数生成器的方法? 例如,一个不错的,仅标题库?

3 个答案:

答案 0 :(得分:9)

英特尔已在http://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide发布了rdrand指令的手册,库和代码示例。

来自自述文件:

  

“因为许多编译器工具链不支持这个新指令,所以这个库是   旨在方便访问它。这个想法很简单:链接到一个内置的静态库并享受新功能!“

main.c中有所有库调用的示例。

我能够在Mac OS X上的gcc中编译静态库和测试程序。文档说明它也兼容Linux和Windows。

请注意,rdrand实际上是一个128位伪随机数生成器,具有硬件生成的熵。 (即将到来的Broadwell架构将提供rdseed指令来访问真正的随机数生成器。)差异的细节及其含义可以在http://software.intel.com/en-us/blogs/2012/11/17/the-difference-between-rdrand-and-rdseed的“长答案”标题下找到。

答案 1 :(得分:1)

以下是示例代码:

#include <immintrin.h>
#include <cstdint>
...
uint64_t val;
if(!_rdseed64_step(&val)) {
  printf("Error generating hardware random value\n");
}
// Now val contains 64-bit pseudo-random number

uint64_t val;
if(!_rdrand64_step(&val)) {
  printf("Error generating hardware random value\n");
}
// Now val contains 64-bit true random number

参考:Intel Intrinsics Guide

答案 2 :(得分:0)

这可能取决于您的操作系统。我想,最近的GNU / Linux内核可能会使用硬件随机生成器来实现,例如/dev/random(因为random(4)手册页显示它使用了噪音),但我可能错了。

通常的做法是使用一些常见的伪随机生成器(例如random(3)标准函数),但在启动应用程序时从一些更随机的源(例如阅读{{1})播种它},使用/dev/urandom以及当前时间getpid()等的内容。)

很可能,获得非常好的随机数是一种黑色艺术,至少对我而言。但是上述解决方案至少具有不易从一个应用程序运行到另一个应用程序的可重现性的优点。

如果您的应用程序持续时间很长(例如,在同一个进程中运行多个小时的Web服务),您可能会不时重新播种伪随机数生成器。对于Web服务器,我想你也可以使用请求时间(以毫秒粒度测量它们)作为随机源(为你的PRNG播种)。