33

uuid.uuid1()を使用して、すべてのMongoDBドキュメントにGUIDを割り当てています。11文字の、大文字と小文字を区別する一意のYouTubeのようなIDを導出できる方法が必要です。

1_XmY09uRJ4 

uuidの結果の16進文字列から

ae0a0c98-f1e5-11e1-9t2b-1231381dac60

データベースに別の文字列を保存せずに、短縮されたIDを16進数に、またはその逆に動的に一致させることができるようにしたい。誰かがサンプルコードを持っているか、これを行うことができるモジュールまたは式の方向に私を向けることができますか?

4

3 に答える 3

64

基になるバイトを 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 は、簡単に検索できるようにデータベースに保存され、より小さい値に基づいている可能性があります。

于 2012-09-04T20:30:02.833 に答える
2

URLセーフな方法でuuidを短縮する方法を特に探している人にとって、@MartijnPietersからの本当に便利な回答は、@ okobokobase64からのその回答に対するコメントと同様に、モジュールを使用してURLセーフではない文字を処理することで簡素化できます(いくつかの不要なビットなしで)。

import base64
import uuid

# uuid to b64 string and back
uuid_to_b64str = base64.urlsafe_b64encode(uuid.uuid1().bytes).decode('utf8').rstrip('=\n')
b64str_to_uuid = uuid.UUID(bytes=base64.urlsafe_b64decode(f'{uuid_to_b64str}=='))

# uuid string to b64 string and back
uuidstr_to_b64str = base64.urlsafe_b64encode(uuid.UUID(str(uuid.uuid1())).bytes).decode('utf8').rstrip('=\n')
b64str_to_uuidstr = str(uuid.UUID(bytes=base64.urlsafe_b64decode(f'{uuidstr_to_b64str}==')))
于 2018-11-29T16:18:46.907 に答える
1

Pythonのbase64モデルを調べることができます。GUID は基本的に数値の base-16 表現であり、ハイフンを削除し、base 16 からデコードし、base 64 にエンコードすることができます。適切な場所で。

于 2012-09-04T20:29:21.140 に答える