最速の決定論的方法
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.getrandbits
python> = 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.randbytes
base64.urlsafe_b64encode
Ubuntu 20.04(私のクラウドサーバー、エントロピーが不足している可能性があります)では、secrets.token_bytes
15倍の時間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.b32encode
base64.b64encode
にPythonコードがたくさんあるため、(Cが実装されている)を呼び出すだけでbase64.b32encode
、劇的に遅くなります(6バイトの場合は5倍、480バイトの場合は17倍)。base64.b64encode
binascii.b2a_base64
ただし、にはpython分岐ステートメントif altchars is not None:
がbase64.b64encode
あり、小さなデータを処理するときに無視できないオーバーヘッドが発生するbinascii.b2a_base64(data, newline=False)
可能性があります。