Il più piccolo hash incorporato Sono consapevole è md5
>>> import hashlib
>>> hashlib.md5("hello worlds").digest().encode("base64")
'uWuHitcvVnCdu1Yo4c6hjQ==\n'
bassa di collisione e breve sono un po 'escludono a vicenda a causa della birthday paradox
Per rendere urlsafe è necessario utilizzare la funzione dalla Base64 modulo
>>> import base64
>>> base64.urlsafe_b64encode(hashlib.md5("hello world").digest())
'XrY7u-Ae7tCTyyK7j1rNww=='
Tuttavia, non dovrebbe esserci alcun problema nel memorizzare il digest md5 a 16 byte nel database in formato binario.
>>> 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=='
È possibile scegliere la quote_plus
o urlsafe_b64encode
per il vostro URL, poi decodificare con la funzione corrispondente unquote_plus
o urlsafe_b64decode
prima di guardare in alto nel database.
fonte
2010-03-24 19:51:52
Grazie. Esiste una funzione di hashish alfanumerica a bassa collisione, a meno di dire 16 caratteri, che non prevede il troncamento? Grazie. – ensnare
Perché non vuoi troncare? –
Si potrebbe anche voler rimuovere tutti i caratteri '=' aggiunti alla fine. Non riducono sostanzialmente il tasso di collisione, ma aggiungono due caratteri. Quindi forse qualcosa del tipo: 'base64.urlsafe_b64encode (hasher.digest() [0:10]). Replace ('=', '')' – speedplane