【问题标题】:random byte string in pythonpython中的随机字节字符串
【发布时间】:2011-07-26 14:43:37
【问题描述】:

我有buf="\x00\xFF\xFF\xFF\xFF\x00"

我怎样才能随机获得"\xFF\xFF\xFF\xFF"

【问题讨论】:

    标签: python string random hex


    【解决方案1】:

    这可用于生成一串随机字节(将n替换为所需数量):

    import random
    random_bytes = bytes([random.randrange(0, 256) for _ in range(0, n)])
    -or-
    random_bytes = bytes([random.randint(0, 255) for _ in range(0, n)])
    -or-
    random_bytes = bytes([random.getrandbits(8) for _ in range(0, n)])
    

    具体问题的答案是:

    import random
    buf = b'\x00' + bytes([random.randrange(0, 256) for _ in range(0, 4)]) + b'\x00'
    -or-
    buf = b'\x00' + bytes([random.randint(0, 255) for _ in range(0, 4)]) + b'\x00'
    -or-
    buf = b'\x00' + bytes([random.getrandbits(8) for _ in range(0, 4)]) + b'\x00'
    

    正如其他人指出的那样,这不应该用于密码学,但对于其他一切都应该很好。

    【讨论】:

      【解决方案2】:

      Python 3.9 添加了一个新的random.randbytes 方法。此方法生成随机字节:

      from random import randbytes
      
      randbytes(4)
      

      输出:

      b'\xf3\xf5\xf8\x98'
      

      不过要小心。仅当您不处理密码学时才应使用它。如文档中所述:

      此方法不应用于生成安全令牌。请改用secrets.token_bytes()

      【讨论】:

      【解决方案3】:

      简单:

      import functools, random, operator
      functools.reduce(operator.add, ('%c' % random.randint(0, 255) for i in range(4)))
      

      【讨论】:

      • 这将返回列表的字符串表示形式,而不是 OP 要求的字符串。
      • "".join(...) 是将序列转换为字符串的首选方式
      【解决方案4】:

      我喜欢为此使用 numpy 库。

      import numpy as np
      
      X_1KB = 1024
      X_256KB = 256 * X_1KB
      X_1MB = 1024 * 1024
      X_4MB = 4 * X_1MB
      X_32MB = 32 * X_1MB
      X_64MB = 2 * X_32MB
      X_128MB = X_1MB * 128
      
      
      np.random.bytes( X_1MB )
      

      【讨论】:

        【解决方案5】:

        获取安全随机字节序列的另一种方法是使用标准库 secrets 模块,该模块从 Python 3.6 开始可用。

        示例,基于给定的问题:

        import secrets
        b"\x00" + secrets.token_bytes(4) + b"\x00"
        

        更多信息请访问: https://docs.python.org/3/library/secrets.html

        【讨论】:

          【解决方案6】:
          bytearray(random.getrandbits(8) for _ in xrange(size))
          

          比其他解决方案更快,但在密码学上不安全。

          【讨论】:

            【解决方案7】:

            在 POSIX 平台上:

            open("/dev/urandom","rb").read(4)
            

            使用/dev/random 以获得更好的随机性。

            【讨论】:

            • 实际上,如果在调用之间保持文件描述符打开,这比 os.urandom 快大约 2.5 倍。对于随机猜测加密货币哈希值很有用。
            • @jcomeau_ictx 如果您不需要 os.urandom 来保证密码安全,为什么还要使用它——prng 比 os.urandom 快得多。
            • @user3467349 公平地说,urandom 可能是真正随机的,而不仅仅是 PRNG
            【解决方案8】:
            from random import randint 
            rstr = ''.join( randint(0, 255) for i in range(4) )
            

            【讨论】:

            • NameError: name 'buf' is not defined
            • 匿名用户评论:除了字符串列表之外,您不能将任何内容加入string,因此将int 更改为string 字符。代码:rstr = "".join( chr(randint(0, 255)) for i in range(4)).
            【解决方案9】:
            >>> import os
            >>> "\x00"+os.urandom(4)+"\x00"
            '\x00!\xc0zK\x00'
            

            【讨论】:

            • 我只是检查 python 文档.. ''.join(chr(random.randint(0,255)) for _ in range(4)) 有什么不同
            • @zack,除了效率更高之外,randint 返回 伪随机 数字。 urandom 返回适合加密使用的随机字节
            • @JohnLaRooy 除非/dev/urandom 使用一些硬件随机数生成器,否则它的数字也是伪随机数。确定性机器将始终生成伪随机数。
            • @NullUserException,参见urandomhere /dev/random 是一种更随机的随机源,但在熵不足时会阻塞。
            • @NullUserException 在 Linux 上,/dev/random 使用已知的熵源作为输入,包括(但不限于)人类用户的鼠标移动、环境噪声等。本身是确定性的,内核+人类+环境的组合不是。
            【解决方案10】:

            是否要将中间 4 个字节设置为随机值?

            buf = '\x00' + ''.join(chr(random.randint(0,255)) for _ in range(4)) + '\x00'
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-01-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-05-20
              • 1970-01-01
              相关资源
              最近更新 更多