tipos tablas resolucion metodo hashing funciones estructura datos colisiones busqueda python hash

python - resolucion - tablas hash estructura de datos



Hash alfanumérico corto de Python con colisiones mínimas. (5)

¿Por qué no truncas SHA1 o MD5? Tendrá más colisiones que si no truncara, pero aún así es mejor que diseñar la suya. Tenga en cuenta que puede codificar en base 64 el hash truncado, en lugar de usar hexadecimal. P.ej

import base64 import hashlib hasher = hashlib.sha1("The quick brown fox") base64.urlsafe_b64encode(hasher.digest()[:10])

Puede truncar tan poco (incluso nada) o tanto como quiera, siempre y cuando comprenda las ventajas y desventajas.

EDITAR: Como mencionó que es seguro para URL, puede usar urlsafe_b64encode y urlsafe_b64decode , que usa - y _ lugar de + y / .

Me gustaría establecer claves primarias no enteras para una tabla usando algún tipo de función hash. md5 () parece ser un poco largo (32 caracteres).

¿Cuáles son algunas funciones hash alternativas que quizás usan todas las letras del alfabeto, así como los números enteros que son quizás más cortos en la longitud de la cadena y tienen bajas tasas de colisión?

¡Gracias!


A continuación se muestra una solución que utiliza caracteres alfanuméricos más algunos caracteres de puntuación. Devuelve cadenas muy cortas (alrededor de 8 caracteres).

import binascii, struct def myhash(s): return binascii.b2a_base64(struct.pack(''i'', hash(s)))


El hash incorporado más pequeño que conozco es md5

>>> import hashlib, base64 >>> d=hashlib.md5(b"hello worlds").digest(); d=base64.b64encode(d); >>> print(d) b''S27ylES0wiLdFAGdUpFgCQ==''

La baja colisión y la corta son un tanto excluyentes debido a la paradoja del cumpleaños

Para hacerlo seguro para urls necesitas usar la función del módulo base64

>>> 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 16 bytes md5 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==''

Puede elegir el quote_plus o el urlsafe_b64encode para su url, luego decodificar con la función correspondiente unquote_plus o urlsafe_b64decode antes de buscarlos en la base de datos.


Hashids es una biblioteca (con soporte de Python) que crea hashes que puedes codificar / decodificar muy fácilmente.

http://hashids.org/python/


Puedes usar algo como la notación base 32. Es más compacto que la notación decimal, no distingue entre mayúsculas y minúsculas y no presenta colisiones. Simplemente codifique un número de secuencia simple para generar un código corto similar a un hash.

Si la clave no es para el consumo humano, puede usar la notación base 64, que es sensible a mayúsculas y minúsculas pero un poco más compacta.

Consulte http://code.google.com/p/py-cupom/ para ver un ejemplo.