数据结构编程实践20讲(Python版)—17散列

往期链接

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!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AnFany

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值