English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
hash()方法返回一个对象的哈希值(如果有)。
哈希值只是一些整数,在字典查找过程中用来比较字典键。
在内部,hash()方法调用__hash__()对象的方法,该方法默认情况下为任何对象设置。我们稍后再看这个。
hash()方法的语法为:
hash(object)
hash()方法采用一个参数:
object -要返回其哈希值的对象(整数,字符串,浮点数)
hash()方法返回一个对象的哈希值(如果有)。
如果对象具有自定义__hash__()方法,则它将返回值截断为Py_ssize_t的大小。
# 整数的哈希值保持不变 print('181的哈希是:', hash(181)) # 十进制哈希 print('181.23的哈希为:',hash(181.23)) # 字符串哈希 print('Python的哈希为:', hash('Python'))
При выполнении этого программы, вывод будет:
181的哈希是: 181 181.23的哈希为: 579773580 Python的哈希为: 2101984854
hash()方法仅适用于不可变对象,如tuple。
# 元音元组 vowels = ('a', 'e', 'i', 'o', 'u') print('hash是:', hash(vowels))
При выполнении этого программы, вывод будет:
hash是: -695778075465126279
如上所述,hash()方法在内部调用__hash__()方法。因此,任何对象都可以覆盖__hash __()以获得自定义哈希值。
但是对于正确的哈希实现,__ hash __()应该始终返回整数。并且,必须同时实现__eq __()和__hash __()方法。
Ниже приведен правильный случай перезаписи __hash__ ()
__eq__ () | __hash__ () | Описание |
---|---|---|
Определено (по умолчанию) | Определено (по умолчанию) | Если оставить без изменений, все объекты будут сравниваться как не равные (кроме самих себя) |
(Если изменяемые) Определено | Не следует определять | Для реализации хэшируемого набора значения хэша ключа должны быть неизменными |
Не определено | Не следует определять | Если не определено __eq__ (), не следует определять __hash__ () |
Определено | Не определено | Классовые примеры не могут использоваться в хэшируемых собраниях. __hash__ () импlicitно установлено вNone Если попытаться извлечь хэш, будет вызван исключение TypeError. |
Определено | Сохранить от родительского класса | __hash__ = <ParentClass>.__hash__ |
Определено | Не хэшировать | __hash__ = None Если попытаться извлечь хэш, будет вызван исключение TypeError. |
class Person: def __init__(self, age, name): self.age = age self.name = name def __eq__(self, other): return self.age == other.age and self.name == other.name def __hash__(self): print('hash является:') return hash((self.age, self.name)) person = Person(23, 'Adam') print(hash(person))
При выполнении этого программы, вывод будет:
hash является: 3785419240612877014
Внимание:Вам не нужно реализовывать метод __eq__ () для хэшей, так как по умолчанию для всех объектов создается хэш.