La plus courte de hachage en python pour le nom des fichiers de cache

Quel est le plus court de hachage (dans le nom de fichier-forme utilisable, comme un hexdigest) disponibles en python? Mon application veut sauver fichiers de cache pour certains objets. L'objet doit être unique repr() de sorte qu'ils sont utilisés pour "graine" le nom de fichier. Je veux produire, éventuellement, un nom de fichier unique pour chaque objet (pas tant que ça). Ils ne doivent pas entrer en collision, mais si ils ne mon application va tout simplement un manque de cache pour cet objet (et aura pour réindexer que les données de l'objet, un mineur le coût de l'application).

Donc, si il ya une collision de nous perdre un fichier de cache, mais c'est le collectées épargne de la mise en cache tous les objets qui rend l'application de démarrage beaucoup plus rapide, donc il n'a pas beaucoup d'importance.

Droit maintenant, je suis en fait en utilisant de l'abs(de hachage(repr(obj))); c'est le droit, la chaîne de hachage! N'ai pas trouvé de collisions, mais je voudrais avoir une meilleure fonction de hachage. hashlib.md5 est disponible dans la bibliothèque python, mais le hexdigest est très long si on les mettait dans un nom de fichier. Des solutions de rechange raisonnables de collision de la résistance?

Edit:
Cas d'utilisation est comme ceci:
Le chargeur de données obtient une nouvelle instance d'un transport de données objet. Types uniques ont unique repr. donc, si un fichier de cache pour hash(repr(obj)) existe, je unpickle que le cache de fichier et de le remplacer obj avec le unpickled objet. Si il y avait une collision et que le cache était un faux match que j'ai un avis. Donc, si nous n'avons pas de cache ou ont un faux match, j'ai plutôt init obj (rechargement de ses données).

Conclusions (?)

La str de hachage en python peut être assez bon, je ne s'inquiète de sa collision de la résistance. Mais si je peux hachage 2**16 objets avec elle, il va être plus que suffisant.

J'ai trouvé comment prendre un hex de hachage à partir de toute source de hachage) et de le stocker de manière compacte avec base64:

# '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("=")
  • Pourquoi se soucier de la longueur des noms de fichiers? Ce n'est pas grave du tout, sauf si vous utilisez un muet système de fichiers
  • Qu'il est laid. Et tous les programmeurs qui veulent exprimer moins avec plus, et là je sais que je peux, plein de hachage cryptographique est exagéré.
  • dans le dernier exemple, pour un python hashlib de hachage, vous pouvez utiliser octets = (..).digest() de cours.
  • Vous ne devez pas utilisez la fonction de hachage car il n'est pas garanti d'être persistant à travers des sessions (ou architectures, même si elle peut être sans importance pour votre cas si tous les fichiers de cache sont stockées localement). En fait, commencer avec Python 3.3, c'est la garantie d'être randomisés pour cordes. Vous devriez envisager d'utiliser écrite à la main à des fonctions telles que ceci.
InformationsquelleAutor u0b34a0f6ae | 2009-08-19