Python-3.12.0文档解读-内置函数hash()详细说明+记忆策略+常用场景+巧妙用法+综合技巧


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

详细说明

功能描述

参数

返回值

特性

使用示例

注意事项

记忆策略

常用场景

使用场景一:字典键的哈希值计算

使用场景二:集合元素的唯一性验证

使用场景三:密码学和数据完整性验证

巧妙用法

技巧一:使用 hash() 进行数据分片

技巧二:使用 hash() 进行数据加密

技巧三:使用 hash() 进行对象标识

综合技巧

技巧一:使用 hash() 和 set() 进行高效的数据去重

技巧二:使用 hash() 和 dict() 进行快速查找和数据分组

技巧三:使用 hash() 和 functools.lru_cache() 进行函数结果缓存


详细说明

功能描述

hash(object) 是Python中的一个内置函数,用于返回对象的哈希值。哈希值是一个整数,它在字典查找元素时用于快速比较字典的键。哈希值的主要目的是为了提高数据结构的查找效率。

参数

  • object:需要计算哈希值的对象。这个对象必须支持哈希操作,即它必须定义了 __hash__() 方法。

返回值

返回一个整数,即对象的哈希值。如果对象不支持哈希操作(没有定义 __hash__() 方法),则抛出 TypeError。

特性

  1. 一致性:对于同一个对象,在同一解释器会话中多次调用 hash() 将始终返回相同的哈希值。然而,在不同的Python解释器会话或不同的计算机上,同一个对象的哈希值可能不同。
  2. 比较性:相同大小的数字变量(如整数和浮点数)即使类型不同,也可能有相同的哈希值。例如,hash(1) 和 hash(1.0) 返回相同的哈希值。
  3. 截断:对于自定义的 __hash__() 方法,hash() 函数会根据主机的位数来截断返回值。这意味着如果 __hash__() 方法返回一个非常大的整数,hash() 可能会返回一个截断后的值。

使用示例

# 示例1: 基本使用
print(hash(1))  # 输出: 1
print(hash(1.0))  # 输出: 1# 示例2: 自定义类的哈希值
class MyClass:def __hash__(self):return 1234567890obj = MyClass()
print(hash(obj))  # 输出: 1234567890# 示例3: 不可哈希的对象
try:hash([1, 2, 3])  # 列表是不可哈希的
except TypeError as e:print(e)  # 输出: unhashable type: 'list'
注意事项
  • 哈希值的生成通常依赖于对象的内部状态,因此如果对象的状态改变,其哈希值也可能改变。这通常不适用于作为字典键的对象,因为字典键的哈希值在字典的生命周期内应该是恒定的。
  • 对于可变对象(如列表、字典和集合),通常不建议作为字典的键,因为它们是不可哈希的。

记忆策略

函数名与功能关联:将“hash”这个词与“哈希值”的概念联系起来。在计算机科学中,“hash”通常指的是将任意长度的输入(又称为预映射,pre-image)通过散列算法转换成固定长度的输出,该输出就是哈希值。因此,看到 hash 这个词,就可以联想到它与生成或获取哈希值有关。


常用场景

使用场景一:字典键的哈希值计算

在创建字典时,字典的键必须是可哈希的。使用 hash(object) 函数可以验证一个对象是否适合作为字典的键。

# 检查一个对象是否可以作为字典的键
class MyKey:def __init__(self, value):self.value = valuedef __hash__(self):return hash(self.value)  # 返回值的哈希值def __eq__(self, other):return self.value == other.value  # 比较值是否相等# 创建一个自定义键对象
key1 = MyKey(10)
key2 = MyKey(10)# 检查键对象的哈希值
print(hash(key1))  # 输出: 哈希值,例如 -2234472024582173133
print(hash(key2))  # 输出: 哈希值,应该与 key1 的哈希值相同,因为它们代表相同的值# 使用自定义键创建字典
my_dict = {key1: "Value for key1"}
print(my_dict[key2])  # 输出: Value for key1,因为 key1 和 key2 被认为是相等的

使用场景二:集合元素的唯一性验证

在集合中,元素必须是唯一的。使用 hash(object) 函数可以帮助验证对象是否可以作为集合的元素。

# 创建一个自定义类,用于集合元素
class MyElement:def __init__(self, value):self.value = valuedef __hash__(self):return hash(self.value)  # 返回值的哈希值def __eq__(self, other):return self.value == other.value  # 比较值是否相等# 创建两个元素
element1 = MyElement(20)
element2 = MyElement(20)# 检查元素的哈希值
print(hash(element1))  # 输出: 哈希值,例如 -2234472024582173133
print(hash(element2))  # 输出: 哈希值,应该与 element1 的哈希值相同# 创建一个集合
my_set = {element1}
print(element2 in my_set)  # 输出: True,因为 element1 和 element2 被认为是相等的

使用场景三:密码学和数据完整性验证

在密码学和数据完整性验证中,经常需要计算数据的哈希值以确保数据未被篡改。

import hashlib# 创建一个简单的字符串
data = "This is a secret message"# 使用 hashlib 计算字符串的哈希值
hash_object = hashlib.sha256(data.encode())
hash_hex = hash_object.hexdigest()# 使用 hash() 函数计算字符串的哈希值(虽然不是最佳实践,但可以用于简单比较)
hash_value = hash(data)print("SHA-256 Hash:", hash_hex)  # 输出: SHA-256 哈希值
print("Built-in Hash:", hash_value)  # 输出: Python 内置哈希值

这些场景展示了 hash(object) 函数在不同情况下的应用,包括验证对象是否适合作为字典键、集合元素以及在密码学中的应用。通过这些示例,可以更好地理解哈希值在实际编程中的重要性和用途。


巧妙用法

hash() 函数在Python中通常用于为对象生成一个整数哈希值,这个哈希值在对象的生命周期内保持不变,除非对象的内容发生改变。这个特性使得 hash() 在某些特定场景下可以有非常巧妙的使用技巧,尤其是结合其他数据结构和算法。以下是一些可能不那么显而易见的使用技巧:

技巧一:使用 hash() 进行数据分片

在处理大型数据集时,可以使用 hash() 来决定数据应该存储在哪个分片中。这种方法可以用于分布式数据库或缓存系统中,以实现数据的均匀分布。

# 假设有一个大型数据集,需要将其均匀分布到多个分片中
data = ["apple", "banana", "cherry", "date", ...]
shards = 10  # 分片数量# 使用 hash() 决定每个元素应该存储在哪个分片中
shard_map = {i: [] for i in range(shards)}
for item in data:# 计算哈希值,并使用模运算决定分片shard_index = hash(item) % shardsshard_map[shard_index].append(item)# 每个分片现在包含了一部分数据
for i, shard_data in shard_map.items():print(f"Shard {i}: {shard_data}")

技巧二:使用 hash() 进行数据加密

虽然 hash() 不是为加密设计的,但在某些情况下,它可以用于简单的数据混淆或加密。例如,可以使用 hash() 来生成一个简单的加密密钥,尽管这种方法的安全性非常有限。

# 使用 hash() 生成一个简单的加密密钥
def generate_key(data):return hash(data)# 示例:使用生成的密钥进行简单的加密
data = "sensitive information"
key = generate_key(data)
encrypted_data = "".join(chr(ord(c) ^ key) for c in data)# 解密
decrypted_data = "".join(chr(ord(c) ^ key) for c in encrypted_data)
print(decrypted_data)  # 输出: sensitive information

技巧三:使用 hash() 进行对象标识

在某些情况下,可以使用 hash() 来生成对象的唯一标识符,尤其是在对象没有内置的唯一标识符时。

# 假设有一个自定义类,没有内置的唯一标识符
class CustomObject:def __init__(self, value):self.value = value# 使用 hash() 生成对象的唯一标识符
obj1 = CustomObject("example1")
obj2 = CustomObject("example2")# 使用哈希值作为对象的唯一标识符
obj_id1 = hash(obj1)
obj_id2 = hash(obj2)print(obj_id1, obj_id2)  # 输出两个不同的哈希值

这些技巧展示了 hash() 函数在不同场景下的巧妙应用,尤其是在处理数据分布、简单加密和对象标识时。然而,需要注意的是,hash() 函数的使用应谨慎,特别是在安全性要求高的场景中,因为它不是为加密或安全目的设计的。


综合技巧

hash() 函数在Python中通常用于为对象生成一个哈希值,这个哈希值可以用于多种巧妙的数据结构和算法中。以下是一些结合 hash() 和其他函数或方法的巧妙用法:

技巧一:使用 hash() 和 set() 进行高效的数据去重

在处理大型数据集时,可以使用 hash() 结合 set() 来快速去重。这种方法利用了哈希表的高效查找特性。

# 假设有一个大型数据集,需要快速去重
data = ["apple", "banana", "cherry", "date", "apple", "banana", ...]# 使用 hash() 和 set() 去重
unique_data = set()
for item in data:# 使用哈希值作为集合的键unique_data.add(hash(item))# unique_data 现在是一个去重后的集合
print(unique_data)

技巧二:使用 hash() 和 dict() 进行快速查找和数据分组

在需要根据某些属性快速查找或分组数据时,可以使用 hash() 结合字典来实现。

# 假设有一个数据集,需要根据某个属性快速查找或分组
data = [("apple", "fruit"), ("banana", "fruit"), ("cherry", "fruit"), ("date", "fruit"), ...]# 使用 hash() 和 dict() 进行数据分组
grouped_data = {}
for item, category in data:# 使用哈希值作为字典的键category_hash = hash(category)if category_hash not in grouped_data:grouped_data[category_hash] = []grouped_data[category_hash].append(item)# grouped_data 现在是一个根据类别分组的字典
for category_hash, items in grouped_data.items():print(f"Category {category_hash}: {items}")

技巧三:使用 hash() 和 functools.lru_cache() 进行函数结果缓存

在编写计算密集型或I/O密集型函数时,可以使用 hash() 结合 functools.lru_cache() 装饰器来缓存函数结果,以减少重复计算。

import functools# 假设有一个计算密集型函数
def expensive_function(arg):# 模拟耗时操作import timetime.sleep(2)  # 假设这是一个耗时的计算return hash(arg)# 使用 functools.lru_cache() 和 hash() 进行结果缓存
@functools.lru_cache()
def cached_expensive_function(arg):return expensive_function(arg)# 现在调用 cached_expensive_function 将利用缓存,避免重复计算
print(cached_expensive_function("example"))

这些技巧展示了如何将 hash() 函数与其他Python内置函数和库结合使用,以实现高效的数据处理和算法优化。这些方法通常利用了哈希值的唯一性和哈希表的高效查找特性,从而在处理大型数据集时提供显著的性能提升。


感谢阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Predictable MDP Abstraction for Unsupervised Model-Based RL

ICML 2023 paper code Intro 文章提出了一种用于无监督基于模型强化学的方法,称为可预测MDP抽象(Predictable MDP Abstraction, PMA)。在MBRL中,一个关键部分是能够准确建模环境动力学动态模型。然而,这个预测模型误…

【SQL国际标准】ISO/IEC 9075:2023 系列SQL的国际标准详情

目录 🌊1. 前言 🌊2. ISO/IEC 9075:2023 系列SQL的国际标准详情 🌊1. 前言 ISO(国际标准化组织,International Organization for Standardization)是一个独立的、非政府间的国际组织,其宗旨是…

IPKISS ------ AMF 添加自定义层

IPKISS ------ AMF 添加自定义层 正文 正文 很多时候,我们想要添加属于我们自己的层,此时我们需要向 AMF pdk 中的 gdsii.py 和 layers.py 文件添加层的信息。这两个文件的目录如下: 在 gdsii.py 文件下的 TECH.GDSII.LAYERTABLE 字典中我们…

工业大模型带来智能生产新范式

在当前工业行业的发展背景下,大模型技术展现出广阔的应用前景,在提升专业知识的可获取性和传承、优化软件技术的应用、提高数据驱动决策的准确性和效率等方面拥有显著潜力。 ‍‍‍‍‍‍‍‍‍‍据了解,蓝卓“基于supOS工业操作系统的工业大…

查看目录或文件的磁盘使用情况

在排查问题过程中,会遇到磁盘占满,需要排查具体哪个文件占用比较大,此时可以使用du 命令 du [选项] [文件或目录...] 常用的选项包括: -h 或 --human-readable:以人类可读的格式(如 K、M、G)…

WAF绕过(下)

过流量检测 这里的流量检测就是在网络层的waf拦截到我们向webshell传输的数据包,以及webshell返回的数据 包,检测其中是否包含敏感信息的一种检测方式。如果是大马的情况下,可以在大马中添加多处判断代码,因此在执行大马提供的功…

吉林大学软件工程易错题

1.【单选题】软件工程方法是( )。 A、为开发软件提供技术上的解决方法 (软件工程方法 ) B、为支持软件开发、维护、管理而研制的计算机程序系统(软件工程工具) …

Vue 3 的 setup语法糖工作原理

前言 我们每天写vue3项目的时候都会使用setup语法糖,但是你有没有思考过下面几个问题。setup语法糖经过编译后是什么样子的?为什么在setup顶层定义的变量可以在template中可以直接使用?为什么import一个组件后就可以直接使用,无需…

KDE-Ambari-Metrics-Collector问题排查解决手册

文档说明 本文档是为了解决KDE平台的Ambari-Metrics-Collector服务在运行时遇到的问题而提供的问题排查和解决方法的参考文档 说明: 当前的Ambari-Metrics-Collector服务包括了ams-collector和ams-hbase两个程序,在Ambari-Metrics-Collector安装的节点执行ps -elf|grep am…

远动通讯屏具体干啥作用

远动通讯屏具体干啥作用 远动通讯屏主要用于电力系统中的各类发电厂、变电站、光伏电站、开闭所、配电房等,具有实时传输数据和远程控制功能。它的主要作用包括: 数据采集:远动通讯屏能够采集各种模拟量、开关量和数字量等信息&#xff0c…

pod介绍之 容器分类与重启策略

目录 一 pod 基础概念介绍 1,pod 是什么 2,Pod使用方式 3,如何解决一个pod 多容器通信 4,pod 组成 5, k8s 中的 pod 二 pause容器 1,pause容器 是什么 2,pause容器作用 3&#xff…

Vue开发实例(十三)用户登录功能

使用Vue实现登录具有以下几个好处: 响应式界面:Vue框架的响应式特性可以帮助开发者轻松地实现用户登录界面的交互效果,包括表单验证、实时错误提示等,从而提升用户体验。组件化开发:Vue框架支持组件化开发,…

最新版npm详解

如:npm中搜索 jQuery image.png image.png 接地气的描述:npm 类似于如下各大手机应用市场 image.png image.png 查看本地 node 和 npm 是否安装成功 image.png image.png 或 npm install -g npm image.png image.png image.png image.png image.…

【数据库】MySQL

文章目录 概述DDL数据库操作查询使用创建删除 表操作创建约束MySqL数据类型数值类型字符串类型日期类型 查询修改删除 DMLinsertupdatedelete DQL基本查询条件查询分组查询分组查询排序查询分页查询 多表设计一对多一对一多对多设计步骤 多表查询概述内连接外连接 子查询标量子…

这所211专硕22408复试线310分,学硕收调剂!辽宁大学计算机考研考情分析!

辽宁大学信息学院下设计算机科学与技术、电子信息科学与技术、通信工程、信息管理与信息系统、软件工程5个本科专业,有计算机软件与理论、计算机应用技术2个硕士学位授权点,软件工程和计算机技术两个专业硕士学位点,1个计算机应用研究所、1个…

案例题(第一版)

案例题目 软件架构设计考点(历年必考) 软件架构设计通常在每年的第一题,该题必考 必备概念 必备概念即考试必须要默写出来的概念 概念描述软件架构风格是指描述特定软件系统组织方式和惯用模式。组织方式描述了系统的组成构件和这些构件的组…

在Spring Boot项目中通过自定义注解实现多数据源以及主备数据库切换

在现代的企业应用开发中,使用多数据源是一个常见的需求。尤其在关键应用中,设置主备数据库可以提高系统的可靠性和可用性。在这篇博客中,我将展示如何在Spring Boot项目中通过自定义注解实现多数据源以及主备数据库切换。 在此说明&#xff…

【HTML】制作一个跟随鼠标的流畅线条引导页界面(可直接复制源码)

目录 前言 HTML部分 CSS部分 JS部分 效果图 总结 前言 无需多言,本文将详细介绍一段HTML代码,图中线条可跟随鼠标移动,具体内容如下: 开始 首先新建一个HTML的文本,文本名改为[index.html],创建好后右…

第十一节 SpringBoot Starter 面试题

一、面试题 很多同学的简历都写着熟悉 SpringBoot, 而 Starter 的实现原理被当作的考题的的情况越来越多。 来源牛客网关于 starter 的一些面试题 情景一、路虎一面 情景二、蔚来 情景三、同花顺 Starter 频频出现,因此在面试准备时,这道题…

mdm 推送证书制作教程

第一步点击获取,点击以后会下载一个zip压缩包 解压以后:会得到四个文件,请务必保存好,待会需要使用 登录apple开发者官网 https://developer.apple.com/account/resources/certificates/list 点击添加证书 找到mdm csr 然后点击…