最轻量级的方法来创建随机字符串和随机十六进制数

xRo*_*bot 75 python

创建一个包含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 只对一个随机模块进行一次调用,不必构建或读取列表,然后使用字符串格式化进行其余操作.

  • 尼斯.只需生成30个十六进制数字的随机数并打印出来.指出时显而易见.好一个. (4认同)
  • 请参阅下面的yaronf使用`string.hexdigits`的答案:http://stackoverflow.com/a/15462293/311288 _"`string.hexdigits`返回`0123456789abcdefABCDEF`(小写和大写),[...]. ,只需使用`random.choice('0123456789abcdef')`."_ (3认同)
  • 使用[`getrandbits`](https://docs.python.org/2/library/random.html#random.getrandbits)而不是`randrange`来使它更快. (2认同)

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)

  • 和random.choice(string.hexdigits) (5认同)
  • 人们可能更喜欢密码学上更安全的“random.SystemRandom().choice” (2认同)
  • xrange() 应该是 range() - NameError: name 'xrange' 未定义 (2认同)

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').


Bob*_*Bob 8

In [1]: import random                                    

In [2]: hex(random.getrandbits(16))                      
Out[2]: '0x3b19'
Run Code Online (Sandbox Code Playgroud)

  • @ggorlen我看不出有什么方法可以提供任何有用的解释。这很简单,很短,没有太多其他的 (2认同)

dsg*_*dfg 6

另一种方法:

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)