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

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)

  • 具体来说,我使用过:base64.urlsafe_b64encode(os.urandom(30)) (63认同)
  • 这可能是因为os.urandom将是一个加密安全的PRNG(通常是流密码),而随机是一个"正常"的PRNG,通常计算速度更快. (9认同)
  • 你可以像第一个例子一样使用random.choice,string.digits和string.letters:>>> import in random,string >>>''.join(random.choice(string.letters + string.digits)for i in xrange(10))'FywhcRLmh1'(我假设你没有像op一样生成一个巨大的字符串,因为它是一个URL ......) (8认同)
  • 有没有办法用它来生成ASCII字符串而不是unicode?例如,所以字符串可以在URL中使用. (6认同)
  • 很抱歉在旧帖子中重新发帖.有没有办法使用`os.urandom(string_length)`并只获取ASCII字母?...由于python是一种解释型语言,一次生成一个字节的循环似乎非常昂贵. (4认同)
  • @BiGYaN:jricher给出了一个解决方案,它返回一个base64编码的字符串,即:仅ASCII字母. (2认同)

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)


fdr*_*fdr 6

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

junk_len = 1024
junk =  (("%%0%dX" % junk_len) % random.getrandbits(junk_len *
8)).decode("hex")
Run Code Online (Sandbox Code Playgroud)

另请参阅问题9236431023290