基になるバイトを base64 値に変換し、=
パディングと改行を取り除きます。
base64.urlsafe_b64encode()
この関数/
を使用してand +
(代わりに_
andが使用される)を使用しないようにすることをお勧めします-
。したがって、結果の文字列を URL パス要素として使用できます。
>>> import uuid, base64
>>> base64.urlsafe_b64encode(uuid.uuid1().bytes).rstrip(b'=').decode('ascii')
'81CMD_bOEeGbPwAjMtYnhg'
逆:
>>> uuid.UUID(bytes=base64.urlsafe_b64decode('81CMD_bOEeGbPwAjMtYnhg' + '=='))
UUID('f3508c0f-f6ce-11e1-9b3f-002332d62786')
それを汎用関数に変換するには:
from base64 import urlsafe_b64decode, urlsafe_b64encode
from uuid import UUID
def uuid2slug(uuidstring):
return urlsafe_b64encode(UUID(uuidstring).bytes).rstrip(b'=').decode('ascii')
def slug2uuid(slug):
return str(UUID(bytes=urlsafe_b64decode(slug + '==')))
これにより、16 バイトの UUID をよりコンパクトな形式で表す方法が得られます。さらに圧縮すると、情報が失われます。つまり、完全な UUID に再度解凍することはできません。16 バイトが表すことができる値の全範囲は、22 個の base64 文字よりも小さいものには決して適合しません。これは、入力の 3 バイトごとに 4 文字を必要とし、すべての文字が 6 ビットの情報をエンコードします。
したがって、YouTube の一意の文字列は完全な 16 バイトの UUID に基づいていません。11 文字の ID は、簡単に検索できるようにデータベースに保存され、より小さい値に基づいている可能性があります。