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

Posted

技术标签:

【中文标题】Python 2.6 中的随机字符串(可以吗?)【英文标题】:Random strings in Python 2.6 (Is this OK?) 【发布时间】:2010-10-21 13:36:44 【问题描述】:

我一直在尝试寻找一种更 Pythonic 的方式来在 python 中生成随机字符串,它也可以扩展。通常,我会看到类似于

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

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

我一直在考虑 random.getrandombits ,并弄清楚如何将其转换为位数组,然后对其进行十六进制编码。使用 python 2.6 我遇到了未记录的 bitarray 对象。不知怎的,我让它工作了,而且看起来真的很快。

它会在大约 3 秒内在我的笔记本上生成一个 5000 万个随机字符串。

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 指出是奇数个字符导致了这个问题。添加了新代码以确保它始终从十六进制发送偶数个十六进制数字。

仍然好奇是否有更好的方法来做这件事一样快。

【问题讨论】:

我怎样才能使它只包含数字、字母和下划线? (这包括破折号) @wenbert ''.join(random.choice(string.letters+string.digits+"_") for i in xrange(length)) 【参考方案1】:
import os
random_string = os.urandom(string_length)

如果你需要 url 安全字符串:

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

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

【讨论】:

这可能是因为 os.urandom 将是一个加密安全的 PRNG(通常是流密码),而 random 是一个“正常”的 PRNG,通常计算速度更快。 有没有办法使用它来生成 ASCII 字符串而不是 unicode?例如,字符串可以在 URL 中使用。 您可以像第一个示例一样使用 random.choice、string.digits 和 string.letters: >>> import random, string >>> ''.join(random.choice(string.letters + string.digits) for i in xrange(10)) 'FywhcRLmh1' (我假设你没有像 op 那样生成一个巨大的字符串,因为它是用于 URL ...) 具体来说,我用过这个:base64.urlsafe_b64encode(os.urandom(30)) 很抱歉在旧帖子中重新发布。有什么方法可以使用 os.urandom(string_length) 并只获取 ASCII 字母吗? ... 由于 python 是一种解释性语言,一次生成一个字节的循环似乎非常昂贵。【参考方案2】:

有时 uuid 足够短,如果您不喜欢破折号,您可以随时使用.replace('-', '') 它们

from uuid import uuid4

random_string = str(uuid4())

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

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

【讨论】:

或使用uuid4().hex获取不带连字符的值【参考方案3】:

关于最后一个示例,无论 junk_len 值如何,以下修复以确保该行是偶数长度:

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

【讨论】:

【参考方案4】:

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

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

另外,请参阅问题 923643 和 1023290

【讨论】:

【参考方案5】:

似乎fromhex() 方法需要偶数个十六进制数字。您的字符串长度为 75 个字符。 请注意something[:-1] 排除最后一个元素!只需使用something[:]

【讨论】:

__hex__() 后面有一个 L。我重写了示例代码。无论如何,我认为你是正确的,它需要偶数位数

以上是关于Python 2.6 中的随机字符串(可以吗?)的主要内容,如果未能解决你的问题,请参考以下文章

将 python 2.7 timedelta.total_seconds() 转换为 python 2.6 中的等价物

2.6W + 字,彻底搞懂 JUC!

python的随机数生成容易重现吗?

python中的变量

Python基础目录

python 基础 2.6 break用法