小智 10
英特尔已rdrand
在http://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide上发布了该指令的手册,库和代码示例.
从自述文件:
"因为许多编译器工具链不支持这个新指令,所以创建这个库是为了方便访问它.这个想法很简单:链接到一个内置的静态库并享受新功能!"
有所有库调用的例子main.c
.
我能够在Mac OS X上的gcc中编译静态库和测试程序.该文档表明它还兼容Linux和Windows.
请注意,这rdrand
实际上是一个128位伪随机数生成器,具有硬件生成的熵.(即将推出的Broadwell架构将提供rdseed
访问真正随机数生成器的指令.)有关差异及其含义的详细信息,请参阅http://software.intel.com/en-us上的"长答案"标题./ blogs/2012/11/17/the-difference-rdrand-and-rdseed.
这可能取决于您的操作系统。我想象最近的 GNU/Linux 内核可能会使用硬件随机生成器/dev/random
(因为random(4)
手册页表明它使用噪声),但我可能是错的。
通常的做法是使用一些常见的伪随机生成器(例如标准random(3)
函数),但在启动应用程序时从一些更随机的源(例如读取/dev/urandom
、使用getpid()
以及当前时间的某些内容gettimeofday()
等)为其提供种子。
很可能,获得非常好的随机数是一门黑术,至少对我来说是这样。但上述解决方案至少具有不易从一个应用程序运行复制到另一个应用程序的优点。
如果您的应用程序是持久的(例如,在同一个进程中运行多个小时的 Web 服务),您可能会不时地重新播种您的伪随机数生成器。对于 Web 服务器,我想您也可以使用请求时间(以毫秒粒度测量它们)作为随机性来源(为您的 PRNG 播种)。