Python 2.6中的随机字符串(可以吗?)

2024-06-13 17:00:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在试图找到一种更像python的方法来生成python中的随机字符串,这种方法也可以伸缩。通常,我看到类似的东西

''.join(random.choice(string.letters) for i in xrange(len))

如果你想生成长字符串,那就太糟糕了。

我考虑random.getrandombits有一段时间了,想办法把它转换成一个位数组,然后对它进行十六进制编码。使用Python2.6,我遇到了bitarray对象,它没有文档记录。不知怎的我成功了,而且看起来很快。

它会在3秒内在我的笔记本上生成一个50mil的随机字符串。

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]

编辑

Heikogerach指出,是奇数个字符引起了这个问题。添加新代码以确保始终从十六进制发送偶数个十六进制数字。

仍然很好奇是否有更好的方法可以这么快。


Tags: 方法字符串forstringlenrandombitsjoin
3条回答
import os
random_string = os.urandom(string_length)

如果需要url安全字符串:

import os
random_string = os.urandom(string_length).hex() 

(注意,在这种情况下,随机字符串长度大于字符串长度)

摘自Python.org上的1023290错误报告:

junk_len = 1024
junk =  (("%%0%dX" % junk_len) % random.getrandbits(junk_len *
8)).decode("hex")

另外,请参见问题9236431023290

有时候uuid足够短,如果你不喜欢破折号,你可以随时替换它们

from uuid import uuid4

random_string = str(uuid4())

如果你想要一个没有破折号的特定长度

random_string_length = 16
str(uuid4()).replace('-', '')[:random_string_length]

相关问题 更多 >