代码之家  ›  专栏  ›  技术社区  ›  mikelikespie

Python2.6中的随机字符串(可以吗?)

  •  76
  • mikelikespie  · 技术社区  · 15 年前

    我一直在试图找到一种更具python风格的方法来在python中生成同样可以扩展的随机字符串。通常,我会看到类似于

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

    如果您想生成长字符串,那么它很糟糕。

    我一直在考虑random.getrandombits,并研究如何将其转换为一个位数组,然后对其进行十六进制编码。在使用Python2.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]
    

    编辑

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

    5 回复  |  直到 15 年前
        1
  •  130
  •   jmny    8 年前
    import os
    random_string = os.urandom(string_length)
    

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

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

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

        2
  •  10
  •   Joelbitar    12 年前

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

    from uuid import uuid4
    
    random_string = str(uuid4())
    

    random_string_length = 16
    str(uuid4()).replace('-', '')[:random_string_length]
    
        3
  •  6
  •   fdr    15 年前

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

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

    另外,请参见问题 923643 1023290

        4
  •  2
  •   unbeknown unbeknown    15 年前

    看来 fromhex() 注意 something[:-1] 排除 最后一个元素!只用 something[:] .

        5
  •  2
  •   user115995    15 年前

    关于最后一个示例,以下修复程序可确保线条长度均匀,无论垃圾长度值是多少:

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