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")