0

这是我的代码:

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <crypt.h>
#include <string.h>
#include <stdlib.h>

int main(void){

int i;
unsigned long seed[2];

/* Generate a (not very) random seed */
seed[0] = time(NULL);
seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000);

printf("Seed 0: %lu ; Seed 1: %lu", seed[0], seed[1]);
return 0;
}

我想生成一些非常随机的种子,这些种子将用于哈希函数,但我不知道该怎么做!

4

3 回答 3

3

选择Mersenne Twister,它是一种广泛使用的伪随机数生成器,因为它非常快,周期很长,分布非常好。不要尝试编写自己的实现,使用任何可用的实现。

于 2012-05-17T22:07:03.487 回答
3

您可以从 /dev/random 读取所需的随机位。

读取时,/dev/random 设备将仅返回熵池中估计的噪声位数内的随机字节。/dev/random 应该适合需要非常高质量随机性的用途,例如一次性填充或密钥生成。当熵池为空时,来自 /dev/random 的读取将被阻塞,直到收集到额外的环境噪声。(http://www.kernel.org/doc/man-pages/online/pages/man4/random.4.html )

int randomSrc = open("/dev/random", O_RDONLY);
unsigned long seed[2];
read(randomSrc , seed, 2 * sizeof(long) );
close(randomSrc);
于 2012-05-17T22:07:41.413 回答
3

因为算法是确定性的,所以你不能得到非常随机的,只能是伪随机的——在大多数情况下,如果你太过分了,你所拥有的就足够了,例如

Mac address + IP address + free space on HD + current free memory + epoch time in ms...

那么你就有可能削弱算法的性能。

如果您的解决方案是交互式的,那么您可以为用户设置一个简短的键入任务并让他们为您生成随机数据 - 测量击键之间的时间并将其乘以他们按下的键的代码 - 即使他们重新键入相同的字符串,时间会稍微偏离——你可以把它混在一起,在它们开始时取模 10 秒,只计算那些击键。

但如果你真的想要 100% 随机数 - 那么你可以使用ANU Quantum Vacuum Random number generator -文章

GitHub 上有一个项目,它是打败坏人的非常棒的方法。

于 2012-05-17T22:07:41.570 回答