1. ホーム
  2. python

Python 2.6でランダムな文字列 (これでOK?)

2023-08-27 02:18:56

質問

私はPythonでランダムな文字列を生成する、よりPythonicな方法を見つけようとしてきました。一般的に、私は次のようなものを見ます。

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

長い文字列を生成したい場合は最悪です。

私はしばらくの間 random.getrandombits について考えていました。そして、それをビットの配列に変換し、それを16進エンコードする方法を考え出しました。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]


編集

heikogerlachは、問題を引き起こしているのが奇数文字であることを指摘しました。常に偶数の16進数でfromhexを送信するように新しいコードが追加されました。

同じように高速でこれを行うより良い方法があるかどうか、まだ興味があります。

どのように解決するのですか?

import os
random_string = os.urandom(string_length)

で、urlセーフの文字列が必要な場合は :

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

(この場合、random_string の長さは string_length よりも大きいことに注意してください)