哈希值 hash()

17.1 哈希值 hash()

哈希值是系统给固定不变的数据算出的一串唯一数字编号。

Python 靠哈希值快速判断两个值是否相等、存进集合/字典。

只有不可变数据才能算出稳定哈希值,叫「可哈希」;可变数据算不出固定哈希,叫「不可哈希」。

💡 能用 hash() 的数据才能存进集合和字典的键。
💡 列表、字典、集合本身不可哈希,但可以存放在集合中(元素本身是列表/字典不行)。

可哈希的类型

整数、字符串、元组都是可哈希的,同一数据哈希值固定不变。

print("整数 10 的哈希值:", hash(10))
print("字符串 'abc' 的哈希值:", hash("abc"))
print("元组 (1,2) 的哈希值:", hash((1, 2)))
print("多次调用 hash('hello'):", hash("hello"), hash("hello"))
print("hash('a'):", hash("a"))
print("hash('b'):", hash("b"))

不可哈希的类型

列表、字典、集合是可变类型,无法生成固定哈希值,调用 hash() 会报 TypeError。

try:
    result = hash([1, 2])  # 列表无法哈希
    print(result)
except TypeError as e:
    print("列表 [1,2] 无法哈希:", e)

try:
    result = hash({"a": 1})  # 字典无法哈希
    print(result)
except TypeError as e:
    print("字典 {'a':1} 无法哈希:", e)

print("原因:列表、字典、集合都是可变的,内容可能改变")
print("所以无法生成固定的哈希值")

⚠️ 常见错误与正确对比

❌ 错误写法
hash([1, 2, 3])
✅ 正确写法
hash((1, 2, 3))

📌 列表是可变的不可哈希,改用元组即可。

❌ 错误写法
s = {[1, 2], 3}
✅ 正确写法
s = {(1, 2), 3}

📌 集合只能存放可哈希的元素,列表不可哈希。