我想知道是否有办法利用英特尔沙桥CPU中的新硬件真数发生器?我读到英特尔的MKL(数学内核库)公开了这个功能,但这需要MKL套件和英特尔编译器,结果非常昂贵。
我的C ++代码中是否有另一种使用硬件随机数生成器的方法? 例如,一个不错的,仅标题库?
答案 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
答案 2 :(得分:0)
这可能取决于您的操作系统。我想,最近的GNU / Linux内核可能会使用硬件随机生成器来实现,例如/dev/random
(因为random(4)
手册页显示它使用了噪音),但我可能错了。
通常的做法是使用一些常见的伪随机生成器(例如random(3)
标准函数),但在启动应用程序时从一些更随机的源(例如阅读{{1})播种它},使用/dev/urandom
以及当前时间getpid()
等的内容。)
如果您的应用程序持续时间很长(例如,在同一个进程中运行多个小时的Web服务),您可能会不时重新播种伪随机数生成器。对于Web服务器,我想你也可以使用请求时间(以毫秒粒度测量它们)作为随机源(为你的PRNG播种)。