2012-05-18 118 views
2

我当然不能使用随机生成器。目前我从unixtime()+ microtime()创建一个CRC32哈希。如何为随机生成器生成良好的随机种子?

有没有比哈希时间()+ microtime()更聪明的方法?虽然我对它的结果并不完全满意,但我预计它会更随机,但我可以看到其中的强模式,直到我添加了更多的MicroTime()调用但它慢得多,米寻找一些这样做的最佳方式。

这个愚蠢的代码生成我能做出迄今为止最好的输出,计算是必要的或我可以看到在输出中的一些模式:

starthash(crc32); 
    addtohash(crc32, MicroTime()); 
    addtohash(crc32, time(NULL)); // 64bit 
    addtohash(crc32, MicroTime()/13.37f); 
    addtohash(crc32, (10.0f-MicroTime())*1337.0f); 
    addtohash(crc32, (11130.0f-MicroTime())/1313137.0f); 
endhash(crc32); 

microtime中()返回程序开始后经过微秒。我已经将addtohash()重载到了每种可能的类型。

我宁愿采取非库解决方案,它可能只是~10行代码,我不想安装庞大的库,因为我实际上并不需要那么多,而且我更感兴趣在代码中,而不仅仅是从函数调用中使用它。

+1

它是如何跨平台? :) –

+1

种子是否“好”取决于你使用伪随机数据。如果您的唯一要求是PRNG在不同的时间输出不同的数据,那么使用时间很好。但是为了每次程序运行时播种一次PRNG,你可以使用CryptGenRandom。 –

+1

一个好的cryprographic rng应该有播种内置。任何其他rng不需要这个。 –

回答

3

如果有任何疑问,请在Windows上从CryptGenRandom获取您的种子,或在* NIX系统上阅读dev/randomdev/urandom

这可能是为了你的目的而矫枉过正,但除非它引起性能问题,否则毫无意义的是像时间这样的低熵源。

这不太可能是无用的。如果你正在编写的代码真的需要高质量的安全随机数据,并没有打扰提到这个问题,那么,你得到你应得的;-)

+0

经过测试,看起来不错(呃?!),虽然慢了两倍。这是怎么做到的,如果不是时间的话? (这就是我感兴趣的部分)。 – Rookie

+0

@Rookie那该怎么办呢?每次程序运行你只会播种一次发电机。(否则:通过对'time()'和'getpid()'/'GetCurrentProcessId()'的结果进行哈希处理,我已经有了很好的结果,但是与Steve提出的解决方案相比,效果并不差。) –

+0

@JamesKanze,不只是一次。但是速度并不那么重要,只是对发生的事情感兴趣,为什么它如此缓慢,而且可以做得更快,为什么呢?虽然,我想我会坚持使用'CryptGenRandom',因为它可以在一次运行中生成我的xor128种子,只需告诉它创建16个字节而不是4个,我认为它甚至可能会更快。 – Rookie

0

你可以检查lfsr &伪随机生成器..通常这是一个hardwre解决方案,但你可以轻松实现自己的软件lfsr

+0

线性反馈移位寄存器工作不像我目前的crc32哈希? – Rookie

+0

是的,crc计算基于lfsr。我建议使用一个额外的lfsr(可以根据需要配置它(长度,初始种子,多义词等))作为伪随机数生成器。这可能是您计算crc或您需要的任何输入数据。 – amanda