我正在和朋友一起开展一个项目,我们需要生成一个随机哈希。在我们有时间讨论之前,我们都提出了不同的方法,因为他们使用不同的模块,我想问你所有更好的东西 - 如果有这样的话。
hashlib.sha1(str(random.random())).hexdigest()
或
os.urandom(16).encode('hex')
输出这个问题让我觉得第二种方法更好。简单比复杂更好。如果您同意,那么“随机”生成哈希值有多可靠?我该如何测试?
答案 0 :(得分:38)
此解决方案:
os.urandom(16).encode('hex')
是最好的,因为uses the OS生成随机性 可用于加密目的(取决于操作系统实现)。
random.random()
生成pseudo-random values。
散列随机值不会添加任何新的随机性。
答案 1 :(得分:7)
random.random()
是一个伪radmom生成器,这意味着数字是从序列生成的。如果你打电话给random.seed(some_number)
,那么生成的序列将始终相同。
os.urandom()
得到来自os'ng的随机数,它使用熵池来收集真实的随机数,通常是来自硬件设备的随机事件,甚至存在随机特殊熵发生器用于很多系统生成随机数。
在unix系统上传统上有两个随机数生成器:/dev/random
和/dev/urandom
。如果没有足够的熵可用,则调用第一个块,而当您读取/dev/urandom
并且没有足够的熵数据可用时,它会使用伪rng并且不会阻塞。
所以使用通常取决于你需要的东西:如果你需要一些均匀分布的随机数,那么内置的prng就足够了。对于加密使用,使用真实的随机数总是更好。
答案 2 :(得分:7)
第二种解决方案显然比第一种解决方案具有更多的熵。假设os.urandom
和random.random
的随机位源的质量相同:
更重要的是,来自os.urandom
的随机性的质量预计并记录为比来自random.random
的随机性好得多。 os.urandom
的文档字符串“适合加密使用”。
答案 3 :(得分:2)
测试随机性是非常困难的 - 然而,我会选择第二种方法,但仅限于(或者,只有在我想到的情况下)这种情况,其中散列由随机数种子。
哈希的重点是根据输入的细微差别创建大不相同的数字。对于您的用例,输入的随机性应该如此。但是,如果你想散列一个文件并检测一个eensy字节的差异,那就是哈希算法闪耀的时候。
但是,我只是好奇:为什么要使用哈希算法呢?看起来你正在寻找一个纯随机数,并且有很多库生成uuid,它比独立数生成器具有更强的唯一性保证。答案 4 :(得分:2)