【发布时间】:2011-07-26 14:43:37
【问题描述】:
我有buf="\x00\xFF\xFF\xFF\xFF\x00"
我怎样才能随机获得"\xFF\xFF\xFF\xFF"?
【问题讨论】:
我有buf="\x00\xFF\xFF\xFF\xFF\x00"
我怎样才能随机获得"\xFF\xFF\xFF\xFF"?
【问题讨论】:
这可用于生成一串随机字节(将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'
正如其他人指出的那样,这不应该用于密码学,但对于其他一切都应该很好。
【讨论】:
Python 3.9 添加了一个新的random.randbytes 方法。此方法生成随机字节:
from random import randbytes
randbytes(4)
输出:
b'\xf3\xf5\xf8\x98'
不过要小心。仅当您不处理密码学时才应使用它。如文档中所述:
此方法不应用于生成安全令牌。请改用
secrets.token_bytes()。
【讨论】:
random.seed:stackoverflow.com/questions/32329381/…为确定性测试设置种子
简单:
import functools, random, operator
functools.reduce(operator.add, ('%c' % random.randint(0, 255) for i in range(4)))
【讨论】:
"".join(...) 是将序列转换为字符串的首选方式
我喜欢为此使用 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 )
【讨论】:
获取安全随机字节序列的另一种方法是使用标准库 secrets 模块,该模块从 Python 3.6 开始可用。
示例,基于给定的问题:
import secrets
b"\x00" + secrets.token_bytes(4) + b"\x00"
【讨论】:
bytearray(random.getrandbits(8) for _ in xrange(size))
比其他解决方案更快,但在密码学上不安全。
【讨论】:
在 POSIX 平台上:
open("/dev/urandom","rb").read(4)
使用/dev/random 以获得更好的随机性。
【讨论】:
prng 比 os.urandom 快得多。
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)).
>>> import os
>>> "\x00"+os.urandom(4)+"\x00"
'\x00!\xc0zK\x00'
【讨论】:
/dev/urandom 使用一些硬件随机数生成器,否则它的数字也是伪随机数。确定性机器将始终生成伪随机数。
urandomhere /dev/random 是一种更随机的随机源,但在熵不足时会阻塞。
是否要将中间 4 个字节设置为随机值?
buf = '\x00' + ''.join(chr(random.randint(0,255)) for _ in range(4)) + '\x00'
【讨论】: