web-dev-qa-db-ja.com

Python 2.6(これでいいですか?)

私はpythonで同様にスケーリングできるランダムな文字列を生成するよりPython的な方法を見つけようとしています。通常、次のようなものが表示されます。

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

あなたが長い文字列を生成したい場合、それはひどいです。

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

編集

heikogerlachは、問題の原因となる文字数が奇数であると指摘しました。常に16進数から偶数の16進数を送信するようにするための新しいコードが追加されました。

これと同じくらい速いより良い方法があるかどうか、まだ興味があります。

77
mikelikespie
import os
random_string = os.urandom(string_length)

そして、URLセーフな文字列が必要な場合:

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

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

130
Seun Osewa

Uuidは十分に短い場合があり、ダッシュが気に入らない場合はいつでも使用できます。replace( '-'、 '')それら

from uuid import uuid4

random_string = str(uuid4())

ダッシュなしで特定の長さにしたい場合

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

Python.orgの 102329 バグレポートから引用:

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

また、問題を参照してください 92364 および 102329

6
fdr

fromhex()メソッドは偶数の16進数を想定しているようです。文字列の長さは75文字です。を注意 something[:-1]除外最後の要素!単にsomething[:]

2
unbeknown

最後の例に関して、次の修正により、junk_lenの値に関係なく、行の長さが偶数になるようにします。

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