Хеш Python: как создать хеш-значение в Python

Python hash () — это встроенный метод, который возвращает хеш-значение объекта, если оно есть. Значения хэша — это просто целые числа, которые используются для быстрого сравнения ключей словаря во время поиска по словарю. Проще говоря, хеш — это целое число фиксированного размера, которое идентифицирует конкретное значение. Обратите внимание, что приведенное выше определение является самым простым объяснением.

Давайте укажем, что может означать фиксированный хеш? См. Следующие пункты.

  1. Одни и те же данные будут иметь одинаковое хеш-значение.
  2. Даже небольшое изменение исходных данных может привести к совершенно другое значение хеш-функции.
  3. Хэш получается из хеш-функции, отвечающей за преобразование части данной информации в закодированный хеш.
  4. Ряд из Объекты могут быть намного больше, чем количество хеш-значений, поэтому два объекта могут иметь одно и то же хеш-значение. Это называется Hash collision . Это означает, что если два объекта имеют одинаковый хэш-код, они не обязательно имеют одно и то же значение.
  5. Объекты, хешированные с помощью hash () , необратимы, что приводит к потере информации.
  6. Метод hash () возвращает хешированное значение только для неизменяемых объектов, поэтому его можно использовать в качестве индикатора для проверки наличия изменяемых/неизменяемых объектов.

Python hash ()

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

Внутри метод hash () вызывает __ hash__ () метод объекта, который устанавливается по умолчанию для любого объекта. Мы рассмотрим это позже.

Хеш-коды наиболее часто используются при сравнении ключей словаря.

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

См. синтаксис метода хеширования ниже.

 hash (object  ) 

Параметры

Параметр объекта, хеш-значение которого должно быть возвращено (целое число, строка, число с плавающей запятой).

См. пример кода ниже.

 # app.pytuple_value = (21, 19, 18, 46, 29) # кортежи неизменяемы list_value = [11, 21, 31  , 41, 51] # список является изменяемым print ("Хеш-значение кортежа:" + str (hash (tuple_value))) print ("Хеш-значение списка:" + str (hash (list_value))) 

См. вывод ниже.

кортеж — это неизменяемый объект , то есть мы можем создать хеш-значение из кортежа.

Список — это изменяемый объект, поэтому он выдает ошибку, как будто мы можем преобразовать список в хэш.

Список является нехешируемым типом.

Возвращаемое значение из hash ()

A Функция hash () возвращает хеш-значение объекта, если оно есть. Если у объекта есть собственный метод __ hash __ () , он обрезает возвращаемое значение до размера Py_ssize_t .

Как hash () работает в Python

См. следующий пример хеширования в Python.

 # app.pyvalue = 1921print ("The  целочисленное хеш-значение: ", hash (value)) valueA = 19.21print (" Хеш-значение float: ", hash (valueA)) 

В приведенном выше коде мы взяли два типа данных .

  1. Integer
  2. Float

Теперь хеш целого числа — это само целое число , но хэш числа с плавающей запятой несколько отличается. См. Вывод ниже.

Python hash () String

Давайте начнем создавать простые примеры и сценарии, в которых может быть полезен метод hash () .

В этом примере мы получим хеш-значение строки.

 # app.pyapp = "Instagram" hash1 = hash (app) hash2 = hash (  app) print ("Hash 1:% s"% hash1) print ("Hash 2:% s"% hash2) 

См. вывод ниже.

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

Здесь есть существенный улов: если вы повторно запустите тот же скрипт, хеш изменится, как показано ниже.

Как определить функцию hash () для пользовательских объектов

Внутри Функция hash () работает, переопределяя функцию __ hash () __ .

Стоит отметить, что не каждый объект может быть хеширован (изменяемые коллекции не хешируются).

Мы также можем определить функцию __hash __ () для нашего пользовательского класса. Вот чем мы сейчас займемся. Перед этим отметим некоторые важные моменты.

См. Следующий пример.

  1. Реализация Hashable не должна выполняться для изменяемых коллекций как ключей коллекций должны быть неизменяемыми для хеширования.
  2. Нам не нужно определять реализацию пользовательской функции __ eq () __ , поскольку она определена для всех объектов.

См. следующий пример кода.

 # app.pyclass Employee: def __init __ (self, empno, name): self.empno = empno self  .name = name def __eq __ (self, other): return self.empno == other.empno и self.name == other.name def __hash __ (self): return hash ((self.empno, self.name)) сотрудник  = Employee (21, 'Krunal') print ("Хеш:% d"% hash (employee)) 

См. Следующий вывод.

Примеры реализации пользовательского хэша для объектов.

Реализация хеширования объектов
__ eq __ () __ hash __ () Описание
Определено (по умолчанию) Определено (по умолчанию) Если оставить как есть , все объекты сравниваются неравно (кроме самих себя)
(Если изменяемый) Определено Не должно быть определено Реализация хешируемой коллекции требует, чтобы хеш-значение ключа было неизменным
Не определено Не должно быть определено Если __eq __ () не определено, __hash __ () не следует определять.
Определено Не определено Экземпляры класса не будут использоваться в качестве хешируемой коллекции.

__ hash __ () неявно установлен в None

Вызывает исключение TypeError при попытке получить хэш.

Defined Сохранить от родителя __ hash__ = .__hash__
Определено Не хочет хешировать __ hash__ = None

Вызывает исключение TypeError при попытке получить хэш.

Почему изменяемый объект не может быть хеширован

Как мы уже знаем, только неизменяемый объект может быть хеширован. Это ограничение, запрещающее хеширование изменяемого объекта, значительно упрощает хеш-таблицу. Давайте разберемся, как.

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

В Python у нас есть два объекта, которые используют хеш-таблицы, словари и наборы:

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

Наконец, Учебное пособие по использованию функции Python hash () завершено.

Оцените статью
nanomode.ru
Добавить комментарий