Что вы подразумеваете под хэш-таблицей в Python?



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



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

417   6  

6 ответов:

С Python глоссарий:

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

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

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

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

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

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

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

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

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

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

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

Comparison between 2 tuplesEquivalence between 2 tuples

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

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

списки структуры данных не hashable, но структура данных кортежи hashable.

в моем понимании ПО на Python словарь, когда вы создаете экземпляр объекта hashable, неразменная ценность также рассчитывается по членам или ценности экземпляра. Например, это значение может быть использовано в качестве ключа в 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, они возвращают одно и то же значение, потому что хэш-значения одинаковы. Для тех объектов, которые не hashable, метод хэш определяется как None:

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

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

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

#x = has(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

Comments

    Ничего не найдено.