Является ли встроенный хэш-метод Python2.6 стабильным по архитектуре?

Мне нужно вычислить хэш, который должен быть стабильным по архитектуре. Является ли хеш python () стабильным?

Чтобы быть более конкретным, в приведенном ниже примере показано, что hash () вычисляет одно и то же значение на двух разных хостах / архитектурах:

# on OSX based laptop >>> hash((1,2,3,4)) 485696759010151909 # on x86_64 Linux host >>> hash((1,2,3,4)) 485696759010151909 

Вышеизложенное верно, по крайней мере, для этих материалов, но мой вопрос касается общего случая

4 Solutions collect form web for “Является ли встроенный хэш-метод Python2.6 стабильным по архитектуре?”

Если вам нужен четко определенный хеш, вы можете использовать один из хэшлиба .

Функция hash() не то, что вы хотите; найти надежный способ сериализации объекта (например, str() или repr() ) и запустить его через hashlib.md5() , вероятно, будет гораздо более предпочтительным.

Подробно – hash() предназначен для возврата целого числа, которое однозначно идентифицирует объект только в течение его жизни . Как только программа запускается снова, построение нового объекта может иметь другой хеш. Уничтожение объекта означает, что в будущем у другого объекта будет этот хеш. Более подробную информацию см. В описании hythable для python .

За кулисами большинство пользовательских объектов python возвращаются к id() чтобы обеспечить их хэш-значение. Хотя вы не должны использовать это, id(obj) и, таким образом, hash(obj) обычно реализуется (например, в CPython) в качестве адреса памяти базового объекта Python. Таким образом, вы можете понять, почему на что нельзя положиться.

Поведение, которое вы сейчас видите, является надежным только для определенных встроенных объектов python, и это не очень далеко. hash({}) например, невозможен.


Что касается hashlib.md5(str(obj)) или эквивалент – вам нужно убедиться, что str(obj) надежно одинаков. В частности, если у вас есть перевод словаря внутри этой строки, он может не отображать его ключи в том же порядке. Могут также быть тонкие различия между версиями python … Я бы определенно рекомендовал unittests для любой реализации, на которую вы полагаетесь.

Нет. На ARM с python 2.6:

 >>> hash((1,2,3,4)) 

89902565

Нет.

 x86_64 >>> print hash("a") 12416037344 i386 >>> print hash("a") -468864544 

Если вам нужен стабильный хеш, создайте дайджест ваших данных, используя что-то вроде sha1, которое можно найти в hashlib

  • Выход из командной строки python
  • Эквивалент для LinkedHashMap в Python
  • разница между len () и .__ len __ ()?
  • Вставка растрового изображения в файл Excel (xlwt) в GAE
  • Получить имя текущего скрипта с помощью Python
  • howto uncompress gzipped данные в массиве байтов?
  • Операторы python if и else, рассчитывающие заработную плату сотрудников
  • (Python) добавление списка в другой без скобок
  • Python - лучший язык программирования в мире.