跳到主要内容

Python hash() 函数

hash() 方法返回对象的哈希值(如果对象有的话)。哈希值就是用来在字典查找过程中快速比较字典键的整数。

示例

text = 'Python Programming'

# 计算 text 的哈希值
hash_value = hash(text)
print(hash_value)

# 输出:-966697084172663693

hash() 语法

hash() 方法的语法是:

hash(object)

hash() 参数

hash() 方法接受单个参数:

  • object - 要返回其哈希值的对象(整数、字符串、浮点数)

hash() 返回值

hash() 方法返回对象的哈希值。

示例 1:Python 中的 hash() 如何工作?

# 整数的哈希值不变
print('181 的哈希值是:', hash(181))

# 小数的哈希值
print('181.23 的哈希值是:',hash(181.23))

# 字符串的哈希值
print('Python 的哈希值是:', hash('Python'))

输出

181 的哈希值是: 181
181.23 的哈希值是: 530343892119126197
Python 的哈希值是: 2230730083538390373

示例 2:不可变元组对象的 hash()?

hash() 方法只适用于不可变对象,如 元组

# 元音元组
vowels = ('a', 'e', 'i', 'o', 'u')

print('哈希值是:', hash(vowels))

输出

哈希值是: -695778075465126279

自定义对象的 hash() 如何工作?

如上所述,hash() 方法内部调用了 __hash__() 方法。因此,任何对象都可以通过重写 __hash__() 来获得自定义的哈希值。

但是,为了正确实现哈希,__hash__() 应该始终返回整数。并且,必须同时实现 __eq__()__hash__() 方法。

以下是正确重写 __hash__() 的情况。

eq()hash()描述
已定义(默认)已定义(默认)如果保持原样,所有对象比较不相等(除了它们自己)
(如果可变)已定义不应定义实现可哈希集合需要键的哈希值是不可变的
未定义不应定义如果未定义 __eq__(),则不应定义 __hash__()
已定义未定义类实例将无法用作可哈希集合。__hash__() 隐式设置为 None。如果尝试检索哈希值,则会引发 TypeError 异常。
已定义保留自父类__hash__ = <ParentClass>.__hash__
已定义不想哈希__hash__ = None。如果尝试检索哈希值,则会引发 TypeError 异常。

示例 3:通过重写 hash() 自定义对象的 hash()

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('哈希值是:')
return hash((self.age, self.name))

person = Person(23, 'Adam')
print(hash(person))

输出

哈希值是:
3785419240612877014

注意: 你不必为哈希实现 __eq__() 方法,因为所有对象默认都有哈希值。