Kürzester Hash in Python zum Benennen von Cache-Dateien

Was ist der kürzeste Hash (in dateinamenverwendbarer Form, wie ein Hexdigest), der in Python verfügbar ist? Meine Anwendung möchte speichernCache-Dateien für einige Objekte. Die Objekte müssen eine eindeutige repr () haben, damit sie den Dateinamen "aussäen" können. Ich möchte einen möglicherweise eindeutigen Dateinamen für jedes Objekt erzeugen (nicht so viele). Sie sollten nicht kollidieren, aber wenn sie dies tun, fehlt meiner App einfach der Cache für dieses Objekt (und sie müssen die Daten dieses Objekts neu indizieren, was nur geringe Kosten für die Anwendung bedeutet).

Wenn es also eine Kollision gibt, verlieren wir eine Cache-Datei, aber die gesammelten Einsparungen beim Zwischenspeichern aller Objekte beschleunigen den Start der Anwendung erheblich, sodass dies keine Rolle spielt.

Im Moment benutze ich tatsächlich abs (hash (repr (obj))); das stimmt, der String-Hash! Ich habe noch keine Kollisionen gefunden, hätte aber gerne eine bessere Hash-Funktion. hashlib.md5 ist in der Python-Bibliothek verfügbar, aber der Hexdigest ist wirklich lang, wenn er in einen Dateinamen eingegeben wird. Alternativen mit angemessener Kollisionsbeständigkeit?

Bearbeiten: Der Anwendungsfall sieht folgendermaßen aus: Der Datenlader erhält eine neue Instanz eines datentragenden Objekts. Einzigartige Typen haben eine einzigartige Repräsentation. also wenn eine cachedatei fürhash(repr(obj)) existiert, lösche ich diese Cache-Datei und ersetze obj durch das nicht ausgewählte Objekt. Wenn es eine Kollision gab und der Cache eine falsche Übereinstimmung war, stelle ich fest. Wenn wir also keinen Cache haben oder eine falsche Übereinstimmung haben, initialisiere ich stattdessen obj (das Neuladen seiner Daten).

Schlussfolgerungen (?)

Dasstr hash in python mag gut genug sein, ich war nur besorgt über die kollisionsresistenz. Aber wenn ich Hasch kann2**16 Objekte mit, es wird mehr als gut genug sein.

Ich habe herausgefunden, wie man einen Hex-Hash (aus einer beliebigen Hash-Quelle) nimmt und ihn kompakt mit base64 speichert:

# '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("=")

Antworten auf die Frage(8)

Ihre Antwort auf die Frage