Каков самый короткий хеш (в форме, пригодной для имени файла, как hexdigest), доступной в python? Мое приложение хочет сохранить файлы кеша для некоторых объектов. Объекты должны иметь уникальную функцию repr(), поэтому они используются для "семени" имени файла. Я хочу создать возможно уникальное имя файла для каждого объекта (не так много). Они не должны сталкиваться, но если они делают мое приложение, просто не хватает кеша для этого объекта (и ему придется переиндексировать данные объекта, что является незначительной стоимостью для приложения).
Итак, если есть одно столкновение, мы теряем один файл кеша, но это совокупная экономия кэширования всех объектов делает запуск приложения намного быстрее, поэтому это не имеет большого значения.
Сейчас я фактически использую abs (hash (repr (obj))); это правильно, строка хеш! Пока не найдено никаких столкновений, но я хотел бы иметь лучшую хэш-функцию. hashlib.md5 доступен в библиотеке python, но hexdigest действительно длинный, если поместить его в имя файла. Альтернативы с разумным сопротивлением столкновению?
Изменить:
Пример использования:
Загрузчик данных получает новый экземпляр объекта, несущего данные. Уникальные типы имеют уникальный реестр. поэтому, если файл кеша для hash(repr(obj))
существует, я распаковываю этот файл кэша и заменяю obj на незакрашенный объект. Если было столкновение, и кеш был ложным совпадением, я замечаю. Поэтому, если у нас нет кеша или ложного совпадения, я вместо этого запускаю obj (перезагружая его данные).
Выводы (?)
Хеш str
в python может быть достаточно хорошим, меня беспокоит только его сопротивление столкновению. Но если я могу хэш 2**16
объектов с ним, это будет более чем достаточно.
Я узнал, как взять шестнадцатеричный хеш (из любого хэш-источника) и хранить его компактно с 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("=")