os.urandom(20) 生成的随机数会重复吗?
这里的 urandom 应该是调用的系统的随机方法吧
在 Django REST Framework 中 Token 的生成方法
def save(self, args, *kwargs):
if not self.key:
self.key = self.generate_key()
return super(Token, self).save(*args, **kwargs)
def generate_key(self):
return binascii.hexlify(os.urandom(20)).decode()
基本上你可以认为,冲突的概率很低了,而且这里指定的是20位的长度,不能说完全没冲突,但是这个概率非常低,基本上认为不会冲突了。
见文档
os.urandom(n)
Return a string of n random bytes suitable for cryptographic use.
This function returns random bytes from an OS-specific randomness source. The returned data should be unpredictable enough for cryptographic applications, though its exact quality depends on the OS implementation.
On a UNIX-like system this will query /dev/urandom, and on Windows it will use
CryptGenRandom(). If a randomness source is not found, NotImplementedError will be raised.
For an easy-to-use interface to the random number generator provided by your platform, please see random.SystemRandom.
里面说 The returned data should be unpredictable enough for cryptographic applications, though its exact quality depends on the OS implementation.
返回的数据是足够的“不可预测的”,以便用于crypto相关的加密。
做了一个测试,产生了1000W条记录,没有重复的,你可以增大数据测试强度再试试。这种非常小概率的事件,从统计的角度来讲,可以认为概率为0.
全选复制放进笔记
import binhex
import binascii
import os
test = {}
for i in range(1000*10000):
c = binascii.hexlify(os.urandom(20)).decode()
if c not in test:
test[c] = 1
else:
print "duplicate " + str(i)
break
print "finished"
你可以试试把生成的数据长度20改成小点的数,比如4(os.urandom(4)),重复下上面的测试, 还是有很大的几率冲突的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。