Najkrótszy hash w pythonie do nazywania plików pamięci podręcznej

Jaka jest najkrótsza wartość skrótu (w postaci używanej w nazwie pliku, np. W postaci szesnastkowej) dostępna w pythonie? Moja aplikacja chce zapisaćpliki pamięci podręcznej dla niektórych obiektów. Obiekty muszą mieć unikalny repr (), aby były używane do „wysiewania” nazwy pliku. Chcę stworzyć możliwie unikalną nazwę pliku dla każdego obiektu (nie tyle). Nie powinny one kolidować, ale jeśli to zrobią, moja aplikacja będzie po prostu brakować pamięci podręcznej dla tego obiektu (i będzie musiała ponownie zindeksować dane tego obiektu, niewielki koszt dla aplikacji).

Tak więc, jeśli istnieje jedna kolizja, tracimy jeden plik pamięci podręcznej, ale to zebrane oszczędności buforowania wszystkich obiektów powodują, że aplikacja uruchamia się znacznie szybciej, więc nie ma to większego znaczenia.

Obecnie używam abs (hash (repr (obj))); to prawda, hash string! Nie znalazłem jeszcze żadnych kolizji, ale chciałbym mieć lepszą funkcję mieszania. hashlib.md5 jest dostępny w bibliotece Pythona, ale kod heksadecymalny jest naprawdę długi, jeśli zostanie umieszczony w nazwie pliku. Alternatywy, przy rozsądnej odporności na kolizje?

Edycja: Przypadek użycia jest następujący: Moduł ładujący pobiera nową instancję obiektu przenoszącego dane. Unikalne typy mają unikalne repr. więc jeśli plik pamięci podręcznej dlahash(repr(obj)) istnieje, rozpakowuję ten plik pamięci podręcznej i zamieniam obiekt na niepokryty obiekt. Jeśli wystąpiła kolizja, a pamięć podręczna była fałszywa, zauważam. Jeśli więc nie mamy pamięci podręcznej lub nie mamy fałszywego dopasowania, to zamiast tego wprowadzę init obj (przeładowując swoje dane).

Wnioski (?)

Thestr hash w pytonie może być wystarczająco dobry, martwiłem się tylko jego odpornością na zderzenia. Ale jeśli mogę mieszać2**16 obiekty z nim, to będzie więcej niż wystarczająco dobre.

Dowiedziałem się, jak pobrać szesnastkową szesnastkę (z dowolnego źródła mieszania) i przechowywać ją kompaktowo za pomocą 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("=")

questionAnswers(8)

yourAnswerToTheQuestion