首页 > os.urandom(20) 生成的随机数会重复吗?

os.urandom(20) 生成的随机数会重复吗?

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.


# -*- coding: utf-8 -*-
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)),重复下上面的测试, 还是有很大的几率冲突的。

当然会重复,既然是随机数,就会随机重复。

【热门文章】
【热门文章】