Самый маленький встроенный хэш Я знаю это md5
>>> import hashlib
>>> hashlib.md5("hello worlds").digest().encode("base64")
'uWuHitcvVnCdu1Yo4c6hjQ==\n'
Низкая коллизия и короткие несколько взаимоисключающих благодаря birthday paradox
Чтобы сделать это urlsafe вам нужно использовать функцию из base64 модуль
>>> import base64
>>> base64.urlsafe_b64encode(hashlib.md5("hello world").digest())
'XrY7u-Ae7tCTyyK7j1rNww=='
Однако не должно быть проблем с хранением 16-байтового преобразования md5 в базе данных в двоичной форме.
>>> md5bytes=hashlib.md5("hello world").digest()
>>> len(md5bytes)
16
>>> urllib.quote_plus(md5bytes)
'%5E%B6%3B%BB%E0%1E%EE%D0%93%CB%22%BB%8FZ%CD%C3'
>>> base64.urlsafe_b64encode(md5bytes)
'XrY7u-Ae7tCTyyK7j1rNww=='
Вы можете выбрать либо quote_plus
или urlsafe_b64encode
для URL, а затем декодировать с соответствующей функцией unquote_plus
или urlsafe_b64decode
, прежде чем искать их в базе данных.
Спасибо. Есть ли какая-либо низкоуровневая буквенно-цифровая хеш-функция, менее 16 символов, что не связано с усечением? Спасибо. – ensnare
Почему вы не хотите усекать? –
Вы также можете удалить все символы '=', добавленные в конец. Они существенно не уменьшают скорость столкновения, но они добавляют два символа. Возможно, что-то вроде: 'base64.urlsafe_b64encode (hasher.digest() [0:10]). Replace ('=', '')' – speedplane