Это то, что я в итоге сделал.
Мне нравится кодировать в base64 подобные вещи, потому что это позволяет избежать проблем, уменьшая набор символов до того, который принят / совместим в большинстве мест, не уменьшая размер ключ слишком похож на шестнадцатеричное кодирование. Вы никогда не знаете, куда вы захотите прикрепить этот ID / ключ в будущем.
Я убрал знак '=' в конце, потому что иногда это вызывает проблемы с URL-адресами. Математически это повышает вероятность столкновения идентификатора, потому что '=' указывает информацию. Но я думаю, что оставшихся данных более чем достаточно для предотвращения коллизий, особенно потому, что sha1 составляет 160 бит вместо 128. UUIDs составляют 128 байтов, потому что, хотя технически возможно иметь коллизию UUID, шансы на то, что это действительно происходит, так бесконечно малы что коллизия практически невозможна (предполагается, что вы используете хороший алгоритм хеширования с хорошим случайным распределением).
import hashlib
import base64
def get_key(raw_text):
m = hashlib.sha1()
m.update(raw_text)
raw_bytes_key = m.digest()
key = base64.urlsafe_b64encode(raw_bytes_key).replace('=', '')
return key