recherche

Maison  >  Questions et réponses  >  le corps du texte

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()
高洛峰高洛峰2816 Il y a quelques jours983

répondre à tous(2)je répondrai

  • PHP中文网

    PHP中文网2017-04-17 17:36:06

    En gros, vous pouvez penser que la probabilité de conflit est très faible, et la longueur spécifiée ici est de 20 bits. On ne peut pas dire qu'il n'y a pas de conflit du tout, mais la probabilité est très faible, et fondamentalement il y en aura. pas de conflit.
    Voir la documentation

    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.
    

    Il indique que les données renvoyées devraient être suffisamment imprévisibles pour les applications cryptographiques, bien que leur qualité exacte dépend de l'implémentation du système d'exploitation.

    Les données renvoyées sont suffisamment « imprévisibles » pour être utiles au chiffrement lié à la cryptographie.

    J'ai fait un test et généré des enregistrements de 1 000 W. Il n'y a pas de doublons. Vous pouvez augmenter l'intensité du test des données et réessayer. D'un point de vue statistique, la probabilité de cet événement de très faible probabilité peut être considérée comme étant de 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)),重复下上面的测试, 还是有很大的几率冲突的。

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 17:36:06

    Bien sûr, il se répétera puisqu'il s'agit d'un nombre aléatoire, il se répétera de manière aléatoire.

    répondre
    0
  • Annulerrépondre