Рубрики
Без рубрики

Функция Python Hash ()

Встроенный хэш (объект) Python (объект) Python принимает один объект в качестве аргумента и возвращает его значение HASH. Поскольку значение HASH рассчитывается на основе данных объекта, два разных но равных объекта должны иметь одинаковое значение хеша. Однако он не следует, что два объекта с одинаковым значением хеша равны – они могут иметь то же самое … Функция Python Hash () Подробнее »

Автор оригинала: Chris.

Python’s Встроенный хеш (объект) Функция принимает один объект в качестве аргумента и возвращает его значение HASH. Поскольку значение HASH рассчитывается на основе данных объекта, два разных но равных объекта должны иметь одинаковое значение хеша. Тем не менее, не следует, что два объекта с одинаковым значением хеша равны – они могут иметь одинаковое хешское значение и все еще отличалось.

Аргумент объект Объект, для которого следует рассчитать значение хеша.
Возвращаемое значение int. Возвращает расчетное хеш-значение.

Учитесь Python Hash () на примере

Основной пример показывает хеш-значение целого числа – это целое число:

>>> hash(42)
42

Однако хеш-значение строки полностью непредсказуемо – по крайней мере, для вас, не зная базовая реализация H пепел () Функция:

>>> hash('42')
-7286207279771019371

Hash Значения поплавок – это либо преобразованное целое число, в котором эта преобразование не теряет никакой информации, ни случайнее целое число, где поплавок имеет ненулевое дробное значение:

>>> hash(42.0)
42
>>> hash(42.1)
230584300921372714

Вы также можете рассчитать хеш-значения кортежи и другие неизменный Типы коллекций. Полученный хеш () Значение – это комбинация хеш () Значения внутри неизменной коллекции.

>>> hash((1, 2, 3))
2528502973977326415

Тем не менее, вы не можете рассчитать хеш () Значение смежных типов сбора, таких как Списки , наборы и Словари Потому что это будет означать, что каждая модификация коллекции должна будет изменять значение хеша. Это невозможно, потому что значения хеша должны быть статичными для одного и того же объекта. Вот почему Python бросает ошибку, если вы попытаетесь рассчитать хеш-значение музейного типа коллекции.

Несчастный список:

>>> hash([1, 2, 3])
Traceback (most recent call last):
  File "", line 1, in 
    hash([1, 2, 3])
TypeError: unhashable type: 'list'

Недасткий набор:

>>> hash({1, 2, 3})
Traceback (most recent call last):
  File "", line 1, in 
    hash({1, 2, 3})
TypeError: unhashable type: 'set'

Недазвимый дикт:

>>> hash({'Alice': 18, 'Bob': 19})
Traceback (most recent call last):
  File "", line 1, in 
    hash({'Alice': 18, 'Bob': 19})
TypeError: unhashable type: 'dict'

Видео Python Hash ()

Но прежде чем мы будем двигаться дальше, я рад представить вам мою новую книгу Python Python One-listers (Amazon Link).

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

Книга была выпущена в 2020 году с помощью книги по программированию мирового класса Nostarch Press (San Francisco).

Ссылка: https://nostarch.com/pythononeliners.

Реализация Python Hash () для пользовательских объектов

Что, если вы определите свой собственный класс, как изменить вычисление хеш () ценить?

Например, скажем, вы создаете клиент класса, который имеет одно значение, стоимость клиента для вашей компании:

class Customer:
    def __init__(self, value):
        self.value = value


alice = Customer(1000)
bob = Customer(1000)

print('Alice Hash Value:', hash(alice))
print('Bob Hash Value:', hash(bob))

Выход может быть следующими двумя значениями хеш:

Alice Hash Value: -9223371944682613630
Bob Hash Value: 92172188494

Проблема с этим заключается в том, что оба должны иметь такое же хешское значение, поскольку их следует рассматривать равным. Итак, как вы можете изменить вывод хеш () Функция на пользовательском объекте?

Внутренне, Python называет объект .__ хеш __ () Дундер Метод для расчета хеш (объект) ценить. Единственное для вас сделать, это перезаписать свое поведение. Вы можете рассчитать хеш-значение пользовательского объекта как комбинацию хеш-значение его атрибутов, используя хеш () Функция звонков на тех!


class Customer:
    def __init__(self, value):
        self.value = value

    def __hash__(self):
        return hash(self.value)

alice = Customer(1000)
bob = Customer(1000)
print('Alice Hash Value:', hash(alice))
print('Bob Hash Value:', hash(bob))

Hash Value Customer Object теперь является хеш-значение связанного целочисленного атрибута ценить :

Alice Hash Value: 1000
Bob Hash Value: 1000

Оба объекта имеют одинаковое значение HASH теперь!

Могут ли разные объекты имеют одинаковое хешское значение?

Поскольку значение HASH рассчитывается на основе данных объекта, два разных но равных объекта должны иметь одинаковое значение хеша. В следующем примере мы создаем два предмета кортежей с тем же содержанием. Но они все еще разные объекты, как доказано звонком T1 T2 который приводит к Ложь Отказ

>>> t1 = (1, 2)
>>> t2 = (1, 2)
>>> t1 is t2
False

Тем не менее, хеш () Значение обоих одинаково!

>>> hash(t1)
3713081631934410656
>>> hash(t2)
3713081631934410656
>>> hash(t1) == hash(t2)
True

Тем не менее, не следует, что два объекта с одинаковым значением хеша равны – они могут иметь одинаковое хешское значение и все еще отличалось.

Отношения __eq __ () и __hash __ ()

Обратите внимание, что это хорошая практика и позволяет избежать многих последующих проблем, чтобы также реализовать __eq __ () Метод при перезаписи __hash __ () Отказ В противном случае два объекта с одинаковым значением хэша все еще могут быть рассмотрены различными при использовании == сравнение. Это было бы нелогично, потому что такое же хеш-значение указывает на то, что они считаются равными!

# BAD PRACTICE 
# (no __eq__ method)
class Customer:
    def __init__(self, value):
        self.value = value

    def __hash__(self):
        return hash(self.value)


alice = Customer(1000)
bob = Customer(1000)
print('Alice Hash Value:', hash(alice))
print('Bob Hash Value:', hash(bob))
print('Are they equal?', bob == alice)

Несоответствующий выход указывает, что хотя Алиса и Боб имеют одинаковое хешское значение, они все еще считаются неравными.

Alice Hash Value: 1000
Bob Hash Value: 1000
Are they equal? False

Вместо этого правильный пример будет следующим, где __eq__ Метод перезаписан.

# GOOD PRACTICE 
# (defined __eq__ method)
class Customer:
    def __init__(self, value):
        self.value = value

    def __hash__(self):
        return hash(self.value)

    def __eq__(self, other):
        return self.value == other.value

alice = Customer(1000)
bob = Customer(1000)
print('Alice Hash Value:', hash(alice))
print('Bob Hash Value:', hash(bob))
print('Are they equal?', bob == alice)

Теперь вывод более согласуется:

Alice Hash Value: 1000
Bob Hash Value: 1000
Are they equal? True

Резюме

Python’s Встроенный хеш (объект) Функция принимает один объект в качестве аргумента и возвращает его значение HASH.

>>> hash(42)
42

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

>>> t1 = (1, 2)
>>> t2 = (1, 2)
>>> hash(t1)
3713081631934410656
>>> hash(t2)
3713081631934410656
>>> hash(t1) == hash(t2)
True
>>> t1 is t2
False

Тем не менее, не следует, что два объекта с одинаковым значением хеша равны – они могут иметь одинаковое хешское значение и все еще отличалось.

Куда пойти отсюда?

Достаточно теории, давайте познакомимся!

Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?

Практические проекты – это то, как вы обостряете вашу пилу в кодировке!

Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?

Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.

Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.

Присоединяйтесь к свободному вебинару сейчас!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.

Оригинал: “https://blog.finxter.com/python-hash-function/”