当前位置:首页 > 科技  > 软件

走进Python Hash函数的魔幻世界:解密哈希算法与防碰撞技术

来源: 责编: 时间:2023-09-18 21:40:59 229观看
导读在计算机科学中,Hash函数(散列函数)是一种将输入数据映射到固定大小的散列值(哈希值)的函数。Python提供了强大而灵活的Hash函数,用于在各种应用中实现数据存储、数据校验、加密等功能。本文将从入门到精通介绍Python中Hash

在计算机科学中,Hash函数(散列函数)是一种将输入数据映射到固定大小的散列值(哈希值)的函数。Python提供了强大而灵活的Hash函数,用于在各种应用中实现数据存储、数据校验、加密等功能。本文将从入门到精通介绍Python中Hash函数的使用。e0G28资讯网——每日最新资讯28at.com

e0G28资讯网——每日最新资讯28at.com

1.什么是Hash函数?

Hash函数是一种将输入(任意长度)映射到固定大小(通常较小)输出的算法。输出的固定长度称为哈希值。Hash函数有以下特性:e0G28资讯网——每日最新资讯28at.com

  • 对于相同的输入,必须始终产生相同的哈希值。
  • 不同的输入应该具有不同的哈希值(尽可能避免冲突)。
  • 不可逆性:无法从哈希值推导出原始输入数据。
  • 任意长度的输入应该产生固定长度的哈希值。

2.Python中的内置Hash函数

Python内置了一个hash()函数,用于计算对象的哈希值。不同类型的对象(如整数、字符串、元组等)具有不同的哈希函数实现。e0G28资讯网——每日最新资讯28at.com

# 使用hash()函数计算哈希值hash_value1 = hash(42)hash_value2 = hash("Hello, Python!")hash_value3 = hash((1, 2, 3))print(f"Hash value of 42: {hash_value1}")print(f"Hash value of 'Hello, Python!': {hash_value2}")print(f"Hash value of (1, 2, 3): {hash_value3}")

3. 常见的Hash算法

Python中常见的Hash算法包括MD5(Message Digest Algorithm 5)、SHA-1(Secure Hash Algorithm 1)和SHA-256等。这些算法被广泛用于数据校验、数据完整性验证和密码学中。首先,我们需要导入Python的hashlib模块:e0G28资讯网——每日最新资讯28at.com

import hashlib

e0G28资讯网——每日最新资讯28at.com

(1) 使用MD5算法计算Hash值

MD5算法会将任意长度的输入转换为128位的哈希值。然而,由于MD5的安全性较差,不再推荐在安全敏感的场景中使用。e0G28资讯网——每日最新资讯28at.com

data = "Hello, MD5!"# 创建MD5对象md5_obj = hashlib.md5()# 更新哈希对象以使用字符串md5_obj.update(data.encode())# 获取MD5哈希值md5_hash = md5_obj.hexdigest()print(f"MD5 Hash of '{data}': {md5_hash}")

(2) 使用SHA-256算法计算Hash值SHA-256算法会将任意长度的输入转换为256位的哈希值,提供了更高的安全性,因此更适合用于数据校验和加密。e0G28资讯网——每日最新资讯28at.com

data = "Hello, SHA-256!"# 创建SHA-256对象sha256_obj = hashlib.sha256()# 更新哈希对象以使用字符串sha256_obj.update(data.encode())# 获取SHA-256哈希值sha256_hash = sha256_obj.hexdigest()print(f"SHA-256 Hash of '{data}': {sha256_hash}")

e0G28资讯网——每日最新资讯28at.com

4.Hash在数据结构中的应用

在数据结构中,Hash函数常用于实现Hash表(散列表)。Hash表是一种用于存储键值对的数据结构,它能够在常数时间复杂度内执行插入、查找和删除操作。Python中,我们可以使用字典(Dictionary)来实现Hash表。字典是一种无序的键值对集合,键必须是可哈希的数据类型。e0G28资讯网——每日最新资讯28at.com

# 创建一个字典person = {    "name": "John Doe",    "age": 30,    "email": "john@example.com"}# 添加新的键值对person["city"] = "New York"# 获取键对应的值print("Name:", person["name"])print("Age:", person["age"])print("Email:", person["email"])print("City:", person.get("city", "City not found"))# 删除键值对del person["email"]# 检查键是否存在if "email" in person:    print("Email found.")else:    print("Email not found.")

5.使用Hash进行数据校验

Hash函数常用于数据完整性验证,即确认数据在传输或存储过程中是否被篡改。在这种应用中,我们先计算原始数据的哈希值,然后将其与接收到的数据的哈希值进行比较。e0G28资讯网——每日最新资讯28at.com

import hashlibdef calculate_hash(data):    # 创建SHA-256对象    sha256_obj = hashlib.sha256()    # 更新哈希对象以使用数据    sha256_obj.update(data)    # 获取SHA-256哈希值    return sha256_obj.digest()    # 原始数据original_data = b"Hello, Hash!"# 计算原始数据的哈希值original_hash = calculate_hash(original_data)# 模拟数据传输或存储过程中数据被篡改tampered_data = b"Hello, Tampered Hash!"# 计算篡改后数据的哈希值tampered_hash = calculate_hash(tampered_data)# 对比哈希值if original_hash == tampered_hash:    print("Data integrity verified: Data is unchanged.")else:    print("Data integrity compromised: Data has been tampered with.")

6.安全性和冲突

Hash函数的安全性是指对于给定的哈希值,很难找到与之对应的原始输入数据。如果不同的输入数据产生了相同的哈希值,就称为哈希冲突。通常情况下,Hash算法都被设计为抵抗预像攻击(Preimage Attack)和第二像攻击(Second Preimage Attack),即找到原始数据或找到与给定哈希值相同的其他数据。然而,完全避免哈希冲突是不可能的。好的Hash算法应该使冲突发生的概率尽可能小。e0G28资讯网——每日最新资讯28at.com

7.Hash表的实现

在前面的例子中,我们已经使用Python的字典来演示了Hash表的功能。现在,我们来简单了解一下Hash表的实现原理。Hash表的基本思想是通过Hash函数将键映射为索引,然后将键值对存储在对应索引的位置上。当我们需要访问某个键的值时,使用Hash函数找到对应的索引,从而快速获取值。Python的字典实现了Hash表的所有功能,它使用了开放定址法解决哈希冲突,并且根据需要动态调整表的大小以保持性能。e0G28资讯网——每日最新资讯28at.com

8.哈希集合和哈希映射

在Python中,除了字典(哈希映射),还有集合(哈希集合)这一数据类型。集合是一组无序且唯一的元素的集合。e0G28资讯网——每日最新资讯28at.com

# 创建一个哈希集合fruits = {"apple", "banana", "orange", "apple", "grape"}print("Fruits:", fruits)  # 输出:{'orange', 'banana', 'grape', 'apple'}

哈希集合的底层实现与哈希映射类似,只不过哈希集合只存储键而没有对应的值。e0G28资讯网——每日最新资讯28at.com

9.使用Hash进行加密

除了数据校验,Hash函数还广泛应用于密码学中的密码哈希。在存储用户密码时,我们通常不会直接存储原始密码,而是将其计算哈希值后存储。这样即使数据库泄漏,攻击者也无法轻易获取用户的真实密码。e0G28资讯网——每日最新资讯28at.com

import hashlibdef hash_password(password):    # 创建SHA-256对象    sha256_obj = hashlib.sha256()    # 更新哈希对象以使用密码    sha256_obj.update(password.encode())    # 获取SHA-256哈希值    return sha256_obj.hexdigest()    # 用户注册时设置密码user_password = "my_secret_password"hashed_password = hash_password(user_password)# 模拟登录验证input_password = input("Enter your password: ")input_hashed_password = hash_password(input_password)if input_hashed_password == hashed_password:    print("Login successful.")else:    print("Invalid password. Please try again.")

10.如何通过hash判断用户上传的文本文件是否重复

通过Hash来判断用户上传的文本文件是否重复,可以利用Hash值的唯一性特性。当用户上传一个文本文件时,我们首先计算该文件的Hash值,并将该Hash值与之前上传文件的Hash值进行对比。如果两个文件的Hash值相同,那么这两个文件很有可能是相同的,即重复上传。以下是一个简单的Python示例代码来实现这个功能:e0G28资讯网——每日最新资讯28at.com

import hashlibdef calculate_file_hash(file_path):    # 创建SHA-256对象    sha256_obj = hashlib.sha256()    # 以二进制方式读取文件内容,避免文本编码问题    with open(file_path, "rb") as file:        while chunk := file.read(8192):  # 每次读取8KB数据            sha256_obj.update(chunk)            # 获取文件的SHA-256哈希值    return sha256_obj.hexdigest()def is_file_duplicate(file_path, known_hashes):    file_hash = calculate_file_hash(file_path)    return file_hash in known_hashes    # 已知的Hash值集合,用于存储之前上传文件的Hash值known_hashes = set()# 假设用户上传了两个文本文件file1_path = "path/to/uploaded_file1.txt"file2_path = "path/to/uploaded_file2.txt"# 检查文件1是否重复if is_file_duplicate(file1_path, known_hashes):    print("File 1 is a duplicate.")else:    print("File 1 is unique.")    known_hashes.add(calculate_file_hash(file1_path))    # 检查文件2是否重复if is_file_duplicate(file2_path, known_hashes):    print("File 2 is a duplicate.")else:    print("File 2 is unique.")    known_hashes.add(calculate_file_hash(file2_path))

在上面的代码中,calculate_file_hash()函数用于计算文件的SHA-256哈希值。is_file_duplicate()函数用于判断文件是否重复,它会将文件的Hash值与之前已知的Hash值集合进行对比。请注意,如果用户上传大量文件,已知的Hash值集合可能会变得非常大。在实际应用中,你可能需要将已知的Hash值存储在数据库中,以便更高效地进行查找和比较。e0G28资讯网——每日最新资讯28at.com

结论Python的Hash函数提供了广泛的应用,从数据结构到数据校验、密码学等领域都有重要作用。了解和熟练掌握Hash函数的使用,对于每个Python开发工程师来说都是必备的技能。无论你是在构建数据结构,进行数据校验,还是在处理密码和加密方面,Hash函数都能帮助你实现高效、安全的解决方案。e0G28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-10440-0.html走进Python Hash函数的魔幻世界:解密哈希算法与防碰撞技术

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Go语言进化之路:泛型的崛起与复用的新篇章

下一篇: Netty Promise和JavaScript Promise对比

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • K6:面向开发人员的现代负载测试工具

    K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • K8S | Service服务发现

    K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 企业采用CRM系统的11个好处

    企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 微信语音大揭秘:为什么禁止转发?

    微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 苹果公司要求三星和LG Display生产「无边框」OLED iPhone显示屏

    苹果公司要求三星和LG Display生产「无边框」OLED iPhone显示屏

    据 The Elec 报道,苹果已要求其供应商为未来的 iPhone 型号开发「无边框」OLED 显示面板。苹果显然已要求三星和 LG Display 开发新的 OLED 显示面
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top