hash() 是 Python 内置的哈希函数,用于返回对象的哈希值(整数)。哈希值是通过哈希算法计算出的固定大小的数值,常用于对象的快速比较、字典键查找和集合成员检测等场景。哈希值在程序运行期间通常保持不变(对于不可变对象)。

一、函数语法

hash(object)

参数:

object:任意可哈希(hashable)的对象,如 int、float、str、tuple 等不可变类型;可变对象(如 list、dict、set)会引发 TypeError。

返回值:

返回一个整数(可为负数),表示对象的哈希值。

二、基础用法示例

1、哈希整数

print(hash(123))   # 123

整数的哈希值就是它本身。

2、哈希浮点数

print(hash(3.14))  # 326484311674566659 (可能)

3、哈希字符串

print(hash("hello"))

每次运行可能不同。Python 3.3+ 默认启用哈希随机化。

4、哈希元组

print(hash((1, 2, 3)))

元组中元素必须都可哈希。

三、哈希值的特点

1、相等对象的哈希值相等

print(hash("abc") == hash("abc"))  # Trueprint(hash(1.0) == hash(1))        # True

2、不同对象的哈希值可能相同(哈希冲突)

哈希冲突是不可避免的,但 Python 会在底层通过比较对象本身来解决冲突。

3、仅对不可变对象有效

hash([1, 2, 3])  # TypeError: unhashable type: 'list'

上例中,列表是可变的,不可哈希。

4、运行期随机化(字符串等类型)

在 Python 3.3 及以上版本,字符串、字节序列等的哈希值会因会话不同而变化,以增强安全性(防御哈希攻击)。

四、常见应用场景

1、字典键查找

Python 字典会先比较键的哈希值,哈希值相同再比较键本身。

d = {"apple": 1, "banana": 2}print(d["apple"])  # 查找时使用哈希值加速

2、集合去重与成员检测

集合成员检测使用哈希表,速度接近 O(1)。

s = {"a", "b", "c"}print("b" in s)  # True

3、自定义对象的哈希

通过定义 __hash__() 方法,可以让自定义对象可哈希。

class Point:    def __init__(self, x, y):        self.x, self.y = x, y    def __hash__(self):        return hash((self.x, self.y))
p = Point(1, 2)print(hash(p))

五、补充说明

1、哈希值不可作为持久唯一标识

由于哈希随机化,某些类型(如字符串)的哈希值在不同 Python 进程间可能不同,不适合持久存储或网络传输。

2、哈希冲突不可避免

使用哈希值判断相等前,Python 会进一步检查对象内容。

3、浮点数精度问题

float('nan') 是不相等的自身,但在同一次 Python 运行期间它的哈希值是可用且固定的,不过不同 Python 会话之间,这个哈希值可能不同(受哈希随机化影响):

import mathprint(hash(float('nan')))  # 哈希值可用,但 nan != nan

图片

“点赞有美意,赞赏是鼓励”

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐