Python 内置函数:hash()
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

“点赞有美意,赞赏是鼓励”
更多推荐



所有评论(0)