这是我的代码:
#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;
}
我想生成一些非常随机种子,它将用于哈希函数,但我不知道该怎么做!
答案 0 :(得分:3)
转到Mersenne Twister,它是一个广泛使用的伪随机数生成器,因为它非常快,具有非常长的周期和非常好的分布。不要尝试编写自己的实现,使用任何available ones。
答案 1 :(得分: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);
答案 2 :(得分:3)
因为算法是确定性的,所以你不能得到非常随机,只有伪随机 - 对于大多数情况下,如果你过分,那么你所拥有的就足够了。
Mac address + IP address + free space on HD + current free memory + epoch time in ms...
然后你冒着削弱算法性能的风险。
如果您的解决方案是交互式的,那么您可以为用户设置一个简短的输入任务并让他们为您生成随机数据 - 测量击键之间的时间并将其乘以他们按下的键的代码 - 即使他们重新输入 - 键入相同的字符串,时间稍微偏离 - 你可以将它混合一点,在它们启动时采用mod 10秒,只计算那些键击。
但如果你真的想要100%随机数 - 那么你可以使用ANU Quantum Vacuum Random number generator - article
有a project on GitHub这是击败坏人的非常棒的方法。