往期链接
01 数组 | 02 链表 | 03 栈 | 04 队列 | 05 二叉树 | 06 二叉搜索树 | 07 AVL树 | 08 红黑树 | 09 B树 | 10 B+树 |
---|
11 线段树 | 12 树状数组 | 13 图形数据结构 | 14 邻接矩阵 | 15 完全图 | 16 有向图 |
---|
17 散列(Hashing)
S1 说明
散列是一种将输入数据(通常称为键)转换为固定大小的字符串或数字的过程,通常称为散列值或哈希值。散列函数是执行此转换的算法,其输出是一个唯一的哈希码,用于快速查找和存储数据。
特点
- 固定长度输出:
无论输入数据的大小如何,散列函数的输出长度是固定的。例如,SHA-256 散列函数始终输出 256 位(32 字节)的哈希值。 - 快速计算:
散列函数的计算速度通常很快,能够在常量时间内生成哈希值。 - 抗碰撞性:
理想的散列函数应当使得不同的输入数据产生相同输出的概率极低。这意味着很难找到两个不同的输入具有相同的哈希值(称为碰撞)。 - 不可逆性:
散列函数应当是不可逆的,即从散列值无法反推原始输入。这使得散列在数据安全和加密中非常有用。 - 敏感性:
微小的输入变化会导致哈希值的大幅变化。这一特性被称为“雪崩效应”。
应用领域
散列在多个领域中有广泛的应用,包括:
- 数据结构:
哈希表:使用散列函数将键映射到数组中的位置,实现快速的查找、插入和删除操作。哈希表广泛用于实现集合和字典等数据结构。 - 密码学:
- 数字签名:用于创建数字签名,通过散列原始消息并对其哈希值进行加密,以确保数据的完整性和- 身份验证。
- 消息认证码(MAC):结合密钥和消息的散列,用于验证消息的完整性和来源。
- 数据完整性:
文件完整性检查:通过计算文件的哈希值,可以快速检查文件在传输或存储过程中是否被篡改(如使用 MD5 或 SHA-256)。 - 数据库:
索引:使用散列值作为索引,以加速数据库中的数据检索。 - 分布式系统:
- 负载均衡:散列函数可用于将请求分配到不同的服务器,以实现负载均衡。
- 一致性哈希:在分布式缓存和存储系统中,使用一致性哈希来管理节点之间的负载分配。
- 区块链:
在区块链技术中,散列函数用于确保区块的完整性和安全性。每个区块包含前一个区块的哈希值,从而形成链式结构,确保数据不可篡改。 - 数据去重:
在数据存储和处理领域,通过计算数据的哈希值,可以有效地识别和去除重复数据。
S2 示例:字符串哈希
import hashlib
def generate_hash(data):
"""生成数据的SHA-256哈希值"""
hash_object = hashlib.sha256()
hash_object.update(data.encode('utf-8')) # 将字符串编码为字节
return hash_object.hexdigest() # 返回十六进制哈希值
# 示例:生成字符串的哈希值
data = "这是一个测试的字符串"
hash_value = generate_hash(data)
print(f"Data: {data}\nHash value (SHA-256): {hash_value}")
结果
Data: 这是一个测试的字符串
Hash value (SHA-256): 377b1b3db6fe1fbc851fff1a893cf163f5f95926725cae3244950e3bc525aa5f
S2 示例:文件、图片哈希
import hashlib
def hash_file(filepath):
"""计算文件的SHA-256哈希值"""
hash_object = hashlib.sha256() # 创建SHA-256哈希对象
with open(filepath, 'rb') as f: # 以二进制模式打开文件
# 分块读取文件内容
while chunk := f.read(8192): # 每次读取8192字节
hash_object.update(chunk) # 更新哈希对象
return hash_object.hexdigest() # 返回哈希值的十六进制表示
# 示例:使用该函数计算txt文件的哈希值
file_path = '青花瓷.txt' # 替换为你的文件路径
file_hash = hash_file(file_path)
print(f"File: {file_path}\nSHA-256 Hash: {file_hash}")
# 示例:使用该函数计算图片文件的哈希值
image_file_path = 'view.jpg' # 替换为你的图片文件路径
image_hash = hash_file(image_file_path)
print(f"Image File: {image_file_path}\nSHA-256 Hash: {image_hash}")
# 示例:使用该函数计算CSV文件的哈希值
csv_file_path = 'example.csv' # 替换为你的CSV文件路径
csv_hash = hash_file(csv_file_path)
print(f"CSV File: {csv_file_path}\nSHA-256 Hash: {csv_hash}")
S3 应用1:食品安全追溯
import hashlib
import json
def generate_hash(data):
"""生成数据的SHA-256哈希值"""
hash_object = hashlib.sha256()
hash_object.update(json.dumps(data, sort_keys=True).encode('utf-8'))
return hash_object.hexdigest()
# 示例食品信息
food_data = {
'product_id': '12345',
'farm': 'Farm A',
'processing_plant': 'Plant B',
'transportation': 'Truck 42',
'timestamp': '2024-10-17T12:00:00'
}
# 生成哈希值
food_hash = generate_hash(food_data)
print(f"Food Data Hash: {food_hash}")
Food Data Hash: 2bb4ee17d665d60e429a4751d0b88c9937ad18ceceef876be67fd655e055dc34
S4 应用2:在线内容版权保护
import hashlib
import json
import time
# 模拟区块链
blockchain = []
def add_to_blockchain(artwork_data):
"""将艺术作品数据添加到区块链"""
hash_value = generate_hash(artwork_data)
block = {
'hash': hash_value,
'data': artwork_data,
'timestamp': time.time()
}
blockchain.append(block)
def generate_hash(data):
"""生成数据的SHA-256哈希值"""
hash_object = hashlib.sha256()
hash_object.update(json.dumps(data, sort_keys=True).encode('utf-8'))
return hash_object.hexdigest()
# 示例艺术作品信息
artwork_data = {
'title': 'Sunset Overdrive',
'artist': 'Alice',
'medium': 'Digital',
'upload_time': '2024-10-17T12:00:00'
}
# 添加艺术作品到区块链
add_to_blockchain(artwork_data)
# 打印区块链
for block in blockchain:
print(f"Block Hash: {block['hash']}, Data: {block['data']}")
Block Hash: fd26f88f3525b9fb031e05ac5b7c40135628a6dad20298c00d9f4da7466aed78, Data: {'title': 'Sunset Overdrive', 'artist': 'Alice', 'medium': 'Digital', 'upload_time': '2024-10-17T12:00:00'}
S5 应用3:社交媒体内容审核
import hashlib
# 已知的不当内容哈希值
banned_hashes = {
# 示例哈希值
'banned_image_hash_1': '46fa43a6ba0edd49ed713ed6dd7ddc740ef35b8013bc4d21aa6c411ea6869043',
'banned_image_hash_2': 'e9a8c06c76bf7d676fc4ffcff900580ce4c5b10ab92c1af0c8e694236df00a7b',
}
def generate_hash(file_path):
"""生成文件的SHA-256哈希值"""
hash_object = hashlib.sha256()
with open(file_path, 'rb') as f:
while chunk := f.read(8192):
hash_object.update(chunk)
return hash_object.hexdigest()
def check_content(file_path):
"""检查上传的内容是否不当"""
content_hash = generate_hash(file_path)
print(content_hash)
if content_hash in banned_hashes.values():
print("Content is inappropriate!")
else:
print("Content is acceptable.")
# 示例:检查图片内容
image_file_path = 'view.jpg' # 替换为实际的图片文件路径
check_content(image_file_path)
Content is inappropriate!