¿Cuál es el hash más corto (en forma de nombre de archivo, como un hexdigest) disponible en python? Mi aplicación quiere guardar archivos de caché para algunos objetos. Los objetos deben tener repr() único, por lo que se usan para 'sembrar' el nombre del archivo. Quiero producir un nombre de archivo posiblemente único para cada objeto (no tantos). No deberían colisionar, pero si lo hacen, mi aplicación simplemente carecerá de memoria caché para ese objeto (y tendrá que volver a indexar los datos de ese objeto, un costo menor para la aplicación).El hash más corto en python para nombrar archivos de caché
Por lo tanto, si hay una colisión perdemos un archivo de caché, pero es el ahorro acumulado de almacenar en caché todos los objetos hace que la aplicación se inicie mucho más rápido, por lo que no importa mucho.
Ahora mismo estoy usando ABS (hash (repr (obj))); ¡Así es, el hash de cuerdas! Aún no he encontrado ninguna colisión, pero me gustaría tener una mejor función hash. hashlib.md5 está disponible en la biblioteca de python, pero el hexdigest es realmente largo si se coloca en un nombre de archivo. Alternativas, con una razonable resistencia a la colisión?
Edit: El caso de uso es así: El cargador de datos recibe una nueva instancia de un objeto que transmite datos. Los tipos únicos tienen repr exclusivo. entonces, si existe un archivo de caché para hash(repr(obj))
, deshago ese archivo de caché y reemplazo obj con el objeto no caído. Si hubo una colisión y el caché fue una coincidencia falsa lo noté. Entonces, si no tenemos memoria caché o tenemos una coincidencia falsa, en su lugar, inicio OBJ (recargando sus datos).
Conclusiones (?)
El hash str
en Python puede ser lo suficientemente bueno, fue sólo preocupado por su resistencia al choque. Pero si puedo usar hash 2**16
objetos con él, será más que suficiente.
descubrí cómo tomar un hash hexagonal (de cualquier fuente de hash) y almacenarlo de forma compacta con base 64:
# 'h' is a string of hex digits
bytes = "".join(chr(int(h[i:i+2], 16)) for i in xrange(0, len(h), 2))
hashstr = base64.urlsafe_b64encode(bytes).rstrip("=")
¿Por qué se preocupan por la longitud de los nombres de archivo? Eso no importa en absoluto, a menos que esté usando un sistema de archivos estúpido –
Es feo. Y todos los programadores quieren expresar menos con más, y aquí sé que puedo, un hash criptográfico completo es exagerado. – u0b34a0f6ae
en el ejemplo final, para un hash hashlib de python, puede usar bytes = (..). Digest() por supuesto. – u0b34a0f6ae