Что означает "хэшируемый" в Python?

Я попробовал поиск в Интернете, но не смог найти значение hashable.

Когда они говорят, что объекты hashable или hashable objects, что это значит?

Ответ 1

Из глоссарий Python:

Объект hashable, если он имеет значение хэша, которое никогда не изменяется в течение его жизненного цикла (ему нужен метод __hash__()), и его можно сравнить с другими объектами (ему нужен метод __eq__() или __cmp__()). Объекты Hashable, которые сравниваются равными, должны иметь одно и то же значение хэш-функции.

Hashability позволяет использовать объект как ключ словаря и член набора, поскольку эти структуры данных используют внутреннее значение хэша.

Все неиспользуемые встроенные объекты Pythons являются хешируемыми, в то время как нет изменяемых контейнеров (таких как списки или словари). Объекты, являющиеся экземплярами пользовательских классов, по умолчанию хешируются; все они сравниваются неравномерно, а их хеш-значение - их id().

Ответ 2

Все ответы здесь содержат хорошее рабочее объяснение хешируемых объектов в python, но я считаю, что нужно сначала понимать термин Хейшинг.

Хеширование - это концепция в информатике, которая используется для создания высокопроизводительных структур псевдослучайного доступа, где необходимо хранить и получать большой объем данных.

Например, если у вас есть 10 000 телефонных номеров, и вы хотите сохранить их в массиве (который представляет собой последовательную структуру данных, которая хранит данные в смежных ячейках памяти и обеспечивает произвольный доступ), но у вас может не быть требуемого количества смежных памяти.

Таким образом, вы можете вместо этого использовать массив размером 100 и использовать хеш-функцию для сопоставления набора значений с одинаковыми индексами, и эти значения могут быть сохранены в связанном списке. Это обеспечивает производительность, аналогичную массиву.

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

Более подробно см. Https://en.wikipedia.org/wiki/Hash_function

Вот еще одна хорошая ссылка: http://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html

Ответ 3

Все, что не является изменчивым (изменяемое означает, что может измениться) может быть хешировано. Помимо хеш-функции, которую нужно искать, например, в классе. dir(tuple) и ищем метод __hash__, вот несколько примеров

#x = hash(set([1,2])) #set unhashable
x = hash(frozenset([1,2])) #hashable
#x = hash(([1,2], [2,3])) #tuple of mutable objects, unhashable
x = hash((1,2,3)) #tuple of immutable objects, hashable
#x = hash()
#x = hash({1,2}) #list of mutable objects, unhashable
#x = hash([1,2,3]) #list of immutable objects, unhashable

Список неизменяемых типов:

int, float, decimal, complex, bool, string, tuple, range, frozenset, bytes

Список изменяемых типов:

list, dict, set, bytearray, user-defined classes

Ответ 5

В моем понимании в соответствии с глоссарием Python, когда вы создаете экземпляр объектов, хешируемых, неизменное значение также вычисляется в соответствии с членами или значениями экземпляра. Например, это значение затем можно использовать в качестве ключа в dict, как показано ниже:

>>> tuple_a = (1,2,3)
>>> tuple_a.__hash__()
2528502973977326415
>>> tuple_b = (2,3,4)
>>> tuple_b.__hash__()
3789705017596477050
>>> tuple_c = (1,2,3)
>>> tuple_c.__hash__()
2528502973977326415
>>> id(a) == id(c)  # a and c same object?
False
>>> a.__hash__() == c.__hash__()  # a and c same value?
True
>>> dict_a = {}
>>> dict_a[tuple_a] = 'hiahia'
>>> dict_a[tuple_c]
'hiahia'

мы можем найти, что хэш-значение tuple_a и tuple_c одинаково, поскольку они имеют одинаковые элементы. Когда мы используем tuple_a в качестве ключа в dict_a, мы можем обнаружить, что значение для dict_a [tuple_c] одинаков, а это значит, что, когда они используются как ключ в dict, они возвращают одно и то же значение, поскольку значения хэша тоже самое. Для тех объектов, которые не хешируются, метод хеш определяется как None:

>>> type(dict.__hash__) 
<class 'NoneType'>

Я предполагаю, что это значение хэша вычисляется при инициализации экземпляра, а не динамическим способом, поэтому только неизменяемые объекты хешируются. Надеюсь, это поможет.

Ответ 6

В python это означает, что объект может быть членом множеств, чтобы вернуть индекс. То есть они имеют уникальный идентификатор /id.

например, в python 3.3:

Списки структуры данных не являются хешируемыми, но структура данных Кортежи являются хешируемыми.

Ответ 7

Позвольте мне привести рабочий пример для понимания хешируемых объектов в python. Я беру 2 Tuples для этого примера. Каждое значение в кортеже имеет уникальное значение хеша, которое никогда не изменяется в течение его жизни. Поэтому, основываясь на этом, имеет значение, выполняется сравнение между двумя кортежами. Мы можем получить хэш-значение элемента кортежа, используя Id().

Comparison between 2 tuplesEquivalence between 2 tuples