6 ответов:
объект хэшируется, если он имеет хэш-значение, которое никогда не меняется в течение его жизни (он нуждается в
__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 ().
в 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