私は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進数を送信するようにするための新しいコードが追加されました。
これと同じくらい速いより良い方法があるかどうか、まだ興味があります。
import os
random_string = os.urandom(string_length)
そして、URLセーフな文字列が必要な場合:
import os
random_string = os.urandom(string_length).hex()
(その場合、random_stringの長さはstring_lengthよりも大きいことに注意してください)
Uuidは十分に短い場合があり、ダッシュが気に入らない場合はいつでも使用できます。replace( '-'、 '')それら
from uuid import uuid4
random_string = str(uuid4())
ダッシュなしで特定の長さにしたい場合
random_string_length = 16
str(uuid4()).replace('-', '')[:random_string_length]
fromhex()
メソッドは偶数の16進数を想定しているようです。文字列の長さは75文字です。を注意 something[:-1]
除外最後の要素!単にsomething[:]
。
最後の例に関して、次の修正により、junk_lenの値に関係なく、行の長さが偶数になるようにします。
junk_len = 1024
junk = (("%%0%dX" % (junk_len * 2)) % random.getrandbits(junk_len * 8)).decode("hex")