Ответ 1
Прежде всего, позвольте мне сказать, что вы не можете гарантировать уникальные результаты. Если вы хотите получить уникальные результаты для всех строк в юниверсе, вам лучше сохранить самую строку (или сжатую версию).
Подробнее об этом за секунду. Сначала сделаем хэши.
путь hashlib
Вы можете использовать любой из основных криптографических хэшей для хэша строки с несколькими шагами:
>>> import hashlib
>>> sha = hashlib.sha1("I am a cat")
>>> sha.hexdigest()
'576f38148ae68c924070538b45a8ef0f73ed8710'
У вас есть выбор между SHA1, SHA224, SHA256, SHA384, SHA512 и MD5 в отношении встроенных модулей.
Какая разница между этими хэш-алгоритмами?
Функция хеша работает, беря данные переменной длины и превращая их в данные фиксированной длины.
Фиксированная длина, в случае каждого из алгоритмов SHA, встроенных в hashlib
, - это количество бит, указанное в имени (за исключением sha1, которое составляет 160 бит). Если вам нужна большая уверенность в том, что две строки не попадут в одно и то же ведро (то же значение хэша), выберите хеш с большим дайджестом (фиксированная длина).
В отсортированном порядке это размеры дайджеста, с которыми вы должны работать:
Algorithm Digest Size (in bits)
md5 128
sha1 160
sha224 224
sha256 256
sha384 384
sha512 512
Чем больше дайджест, тем меньше вероятность столкновения, если ваша хеш-функция стоит соли.
Подождите, как насчет hash()
?
Встроенная функция hash()
возвращает целые числа, которые также могут быть просты в использовании для цели. Однако есть проблемы.
>>> hash('moo')
6387157653034356308
-
Если ваша программа будет запущена в разных системах, вы не можете быть уверены, что
hash
вернет ту же самую вещь. На самом деле, я работаю на 64-битном поле, используя 64-битный Python. Эти значения будут сильно отличаться от 32-битного Python. -
Для Python 3.3+, как указано @gnibbler,
hash()
рандомизируется между прогонами. Он будет работать в течение одного прогона, но почти наверняка не будет работать в разных версиях вашей программы (вытаскивая из упомянутого текстового файла).
Почему hash()
будет построен таким образом? Ну, встроенный хэш существует по одной конкретной причине. Хэш-таблицы/словари/поиск таблиц в памяти. Не для криптографического использования, а для дешевых поисков во время выполнения.
Не используйте hash()
, используйте hashlib
.