Python 2.6中的随机string(可以吗?)
我一直在试图find一个更pythonic的方式来产生随机string在Python中,也可以扩展。 通常,我看到类似的东西
''.join(random.choice(string.letters) for i in xrange(len))
这很糟糕,如果你想要产生长的string。
我一直在考虑random.getrandombits一段时间,并找出如何将其转换为一个位数组,然后hex编码。 使用Python 2.6我碰到了bitarray对象,这是没有logging。 不知怎的,我得到它的工作,而且看起来非常快。
它在我的笔记本上产生一个50mil的随机string,大约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]
编辑
heikogerlach指出,这是一个奇怪的人物造成这个问题。 添加新的代码,以确保它总是从hex数发送hex数。
仍然好奇,如果有更好的方式做到这一点一样快。
import os random_string = os.urandom(string_length)
如果你需要url安全string:
import os random_string = os.urandom(string_length).hex()
(注意在这种情况下random_string的长度比string_length长)
有时一个uuid足够短,如果你不喜欢破折号,你可以随时取消(' – ','')他们
from uuid import uuid4 random_string = str(uuid4())
如果你想要一个没有破折号的特定长度
random_string_length = 16 str(uuid4()).replace('-', '')[:random_string_length]
取自Python.org上的1023290错误报告:
junk_len = 1024 junk = (("%%0%dX" % junk_len) % random.getrandbits(junk_len * 8)).decode("hex")
另请参阅问题923643和1023290
看来fromhex()
方法需要偶数个hex数字。 您的string长度为75个字符。 请注意, something[:-1]
排除了最后一个元素! 只需使用something[:]
。
关于最后一个示例,下面的修复确保该行甚至是长度,无论junk_len值如何:
junk_len = 1024 junk = (("%%0%dX" % (junk_len * 2)) % random.getrandbits(junk_len * 8)).decode("hex")