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

查看:736
本文介绍了python - 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)),重复下上面的测试, 还是有很大的几率冲突的。

这篇关于python - os.urandom(20) 生成的随机数会重复吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆