El más pequeño de hash incorporado soy consciente de es MD5
>>> import hashlib
>>> hashlib.md5("hello worlds").digest().encode("base64")
'uWuHitcvVnCdu1Yo4c6hjQ==\n'
baja colisión y corta son algo mutuamente excluyentes debido a la birthday paradox
Para que sea urlsafe es necesario utilizar la función de la base 64 módulo
>>> import base64
>>> base64.urlsafe_b64encode(hashlib.md5("hello world").digest())
'XrY7u-Ae7tCTyyK7j1rNww=='
Sin embargo, no debería haber ningún problema al almacenar el resumen de md5 de 16 bytes en la base de datos en forma binaria.
>>> 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=='
Se puede elegir entre el quote_plus
o la urlsafe_b64encode
para su url, entonces decodificar con la función correspondiente unquote_plus
o urlsafe_b64decode
antes de que se vean en la base de datos.
Thanks. ¿Hay alguna función hash alfanumérica de baja colisión, menos de 16 caracteres, que no implica truncar? Gracias. – ensnare
¿Por qué no quieres truncar? –
Es posible que también desee eliminar todos los caracteres '=' añadidos al final. No reducen sustancialmente la tasa de colisión, pero agregan dos caracteres. Así que tal vez algo como: 'base64.urlsafe_b64encode (hasher.digest() [0:10]). Replace ('=', '')' – speedplane