最速の決定論的方法
import random
import binascii
e = random.Random(seed)
binascii.b2a_base64(random.getrandbits(48).to_bytes(6, 'little'), newline=False)
最速のシステムランダム法
import os
import binascii
binascii.b2a_base64(os.urandom(6), newline=False)
URLセーフメソッド
使用するos.urandom
import os
import base64
base64.urlsafe_b64encode(os.urandom(6)).decode()
使用random.Random.choices(遅いが柔軟)
import random
import string
alphabet = string.ascii_letters + string.digits + '-_'
''.join(random.choices(alphabet, k=8))
使用random.Random.getrandbits(より速いrandom.Random.randbytes)
import random
import base64
base64.urlsafe_b64encode(random.getrandbits(48).to_bytes(6, 'little')).decode()
使用random.Random.randbytes(python> = 3.9)
import random
import base64
base64.urlsafe_b64encode(random.randbytes(6)).decode()
使用random.SystemRandom.randbytes(python> = 3.9)
import random
import base64
e = random.SystemRandom()
base64.urlsafe_b64encode(e.randbytes(6)).decode()
random.SystemRandom.getrandbitspython> = 3.9の場合は、比較して2.5倍の時間がかかり、random.SystemRandom.randbytesより複雑になるため、お勧めしません。
使用secrets.token_bytes(python> = 3.6)
import secrets
import base64
base64.urlsafe_b64encode(secrets.token_bytes(6)).decode()
使用secrets.token_urlsafe(python> = 3.6)
import secrets
secrets.token_urlsafe(6) # 6 byte base64 has 8 char
さらなる議論
python3.9でのsecrets.token_urlsafeの実装
tok = token_bytes(nbytes)
base64.urlsafe_b64encode(tok).rstrip(b'=').decode('ascii')
ASCIIバイト.decode()は。よりも高速であるため.decode('ascii')、 。の.rstrip(b'=')場合は役に立ちませんnbytes % 6 == 0。
base64.urlsafe_b64encode(secrets.token_bytes(nbytes)).decode()より高速です(〜20%)。
Windows10では、バイトベースの方法は、nbytes = 6(8文字)の場合は2倍高速で、nbytes = 24(32文字)の場合は5倍高速です。
Windows 10(私のラップトップ)では、のようにsecrets.token_bytes同様の時間がかかり、ランダムなバイト生成よりも時間がかかります。random.Random.randbytesbase64.urlsafe_b64encode
Ubuntu 20.04(私のクラウドサーバー、エントロピーが不足している可能性があります)では、secrets.token_bytes15倍の時間random.Random.randbytesがかかりますが、次のように同様の時間がかかりますrandom.SystemRandom.randbytes
secrets.token_bytes使用random.SystemRandom.randbytesするのでos.urandom(したがって、それらはまったく同じです)、パフォーマンスが重要な場合は、に置き換えるsecrets.token_bytesことができます。os.urandom
Python3.9では、はとbase64.urlsafe_b64encodeの組み合わせであるbase64.b64encodeためbytes.translate、約30%多くの時間がかかります。
random.Random.randbytes(n)によって実装されるrandom.Random.getrandbits(n * 8).to_bytes(n, 'little')ため、3倍遅くなります。(ただし、random.SystemRandom.getrandbitsで実装されますrandom.SystemRandom.randbytes)
base64.b32encodebase64.b64encodeにPythonコードがたくさんあるため、(Cが実装されている)を呼び出すだけでbase64.b32encode、劇的に遅くなります(6バイトの場合は5倍、480バイトの場合は17倍)。base64.b64encodebinascii.b2a_base64
ただし、にはpython分岐ステートメントif altchars is not None:がbase64.b64encodeあり、小さなデータを処理するときに無視できないオーバーヘッドが発生するbinascii.b2a_base64(data, newline=False)可能性があります。