创建一个包含30个字符的随机字符串的最轻量级方法是什么,如下所示?
ufhy3skj5nca0d2dfh9hwd2tbk9sw1
和十六进制的十六进制数字如下?
8c6f78ac23b4a7b8c0182d7a89e9b1
jcd*_*yer 109
十六进制输出的速度更快.使用与上述相同的t1和t2:
>>> t1 = timeit.Timer("''.join(random.choice('0123456789abcdef') for n in xrange(30))", "import random")
>>> t2 = timeit.Timer("binascii.b2a_hex(os.urandom(15))", "import os, binascii")
>>> t3 = timeit.Timer("'%030x' % random.randrange(16**30)", "import random")
>>> for t in t1, t2, t3:
... t.timeit()
...
28.165037870407104
9.0292739868164062
5.2836320400238037
Run Code Online (Sandbox Code Playgroud)
t3 只对一个随机模块进行一次调用,不必构建或读取列表,然后使用字符串格式化进行其余操作.
wum*_*ump 71
30位十六进制字符串:
>>> import os,binascii
>>> print binascii.b2a_hex(os.urandom(15))
"c84766ca4a3ce52c3602bbf02ad1f7"
Run Code Online (Sandbox Code Playgroud)
优点是,这直接来自操作系统的随机性,这可能比random()更安全和/或更快,并且您不必为其播种.
ACh*_*ion 34
在Py3.6 +中,另一种选择是使用新的标准secrets模块:
>>> import secrets
>>> secrets.token_hex(15)
'8d9bad5b43259c6ee27d9aadc7b832'
>>> secrets.token_urlsafe(22) # may include '_-' unclear if that is acceptable
'teRq7IqhaRU0S3euX1ji9f58WzUkrg'
Run Code Online (Sandbox Code Playgroud)
eem*_*emz 28
import string
import random
lst = [random.choice(string.ascii_letters + string.digits) for n in xrange(30)]
str = "".join(lst)
print str
ocwbKCiuAJLRJgM1bWNV1TPSH0F2Lb
Run Code Online (Sandbox Code Playgroud)
Kur*_*ler 24
解决方案比这里的解决方案快得多:
timeit("'%0x' % getrandbits(30 * 4)", "from random import getrandbits")
0.8056681156158447
Run Code Online (Sandbox Code Playgroud)
yar*_*onf 15
注意:random.choice(string.hexdigits)不正确,因为string.hexdigits返回0123456789abcdefABCDEF(小写和大写),因此您将获得偏差结果,十六进制数字'c'可能显示为数字'7'的两倍.相反,只需使用random.choice('0123456789abcdef').
In [1]: import random
In [2]: hex(random.getrandbits(16))
Out[2]: '0x3b19'
Run Code Online (Sandbox Code Playgroud)
另一种方法:
from Crypto import Random
import binascii
my_hex_value = binascii.hexlify(Random.get_random_bytes(30))
Run Code Online (Sandbox Code Playgroud)
重点是:字节值始终等于十六进制值.
小智 5
单线功能:
import random
import string
def generate_random_key(length):
return ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(length))
print generate_random_key(30)
Run Code Online (Sandbox Code Playgroud)