Является ли встроенный хэш-метод 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
  • «Слишком много конфликтов» при создании нового объекта в dataStore
  • найти максимальную длину последовательных повторных чисел в списке (python)
  • Python Распаковать список аргументов для строки формата
  • сельдерейное сердцебиение (on_node_lost)
  • Повторить вызов функции Python на исключение?
  • Как получить ключ для текущей записи в GAE ndb в цикле Python?
  • Pycharm 5.0.1: сканирование файлов на индексирование навсегда
  •  
    Interesting Posts for Van-Lav

    Python – получить права доступа к ACL для окон

    Поиск строки в большом текстовом файле – профилирование различных методов в python

    передача содержимого из нескольких списков, сгенерированных в разных функциях в файл

    Что эквивалентно репутату MATLAB в NumPy

    ImportError: PyCapsule_Import не смог импортировать модуль "pyexpat"

    Получение подмассивов из массива numpy с заданным шагом / шагом

    Как обрабатывать поступающие данные в реальном времени с помощью python pandas

    Лучший способ присоединиться к двум крупным наборам данных в Pandas

    Получение температуры процессора с помощью Python?

    Почему учетная запись администратора Django дает мне 403 ошибку CSRF?

    Максимальный размер для модуля полки python?

    Websocket отключается сразу после подключения (повторно)

    Как проверить, была ли вставка успешной с MySQLdb в Python?

    многопоточность jython

    Отфильтровать часть изображения с помощью PIL, python

    Python - лучший язык программирования в мире.