mik*_*pie 77 python random python-2.6
我一直试图找到一种更加pythonic的方法来生成python中的随机字符串,它也可以扩展.通常情况下,我会看到类似的东西
''.join(random.choice(string.letters) for i in xrange(len))
Run Code Online (Sandbox Code Playgroud)
如果你想生成长字符串很糟糕.
我一直在考虑random.getrandombits一段时间,并想出如何将其转换为一个位数组,然后十六进制编码.使用python 2.6我遇到了bitarray对象,没有记录.不知何故,我让它工作,它似乎真的很快.
它在我的笔记本上生成一个50mil的随机字符串,仅需3秒钟.
def rand1(leng):
nbits = leng * 6 + 1
bits = random.getrandbits(nbits)
uc = u"%0x" % bits
newlen = int(len(uc) / 2) * 2 # we have to make the string an even length
ba = bytearray.fromhex(uc[:newlen])
return base64.urlsafe_b64encode(str(ba))[:leng]
Run Code Online (Sandbox Code Playgroud)
编辑
heikogerlach指出,造成这个问题的人数奇怪.添加了新代码以确保始终从偶数个十六进制数字发送.
仍然很好奇,如果有更好的方法做到这一点同样快.
Seu*_*ewa 129
import os
random_string = os.urandom(string_length)
Run Code Online (Sandbox Code Playgroud)
如果你需要url安全字符串:
import os
random_string = os.urandom(string_length).hex()
Run Code Online (Sandbox Code Playgroud)
(注意random_string长度在这种情况下大于string_length)
Joe*_*tar 10
有时一个uuid足够短,如果你不喜欢破折号,你可以随时改变它们(' - ','')它们
from uuid import uuid4
random_string = str(uuid4())
Run Code Online (Sandbox Code Playgroud)
如果你想要一个没有破折号的特定长度
random_string_length = 16
str(uuid4()).replace('-', '')[:random_string_length]
Run Code Online (Sandbox Code Playgroud)
摘自Python.org 的1023290错误报告:
junk_len = 1024
junk = (("%%0%dX" % junk_len) % random.getrandbits(junk_len *
8)).decode("hex")
Run Code Online (Sandbox Code Playgroud)