图像去重技术:MD5哈希在自动化中的应用

2024-06-15 23:36

本文主要是介绍图像去重技术:MD5哈希在自动化中的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

一、MD5的介绍

二、常见的MD5哈希用途

三、hashlib库介绍

四、实际应用-图片去重


前言

MD5(Message Digest Algorithm 5)是一种广泛使用的哈希函数,它可以产生一个128位(16字节)的哈希值,通常用一个32位的十六进制字符串表示。如果两张图像的内容完全相同,那么它们经过MD5哈希处理后得到的哈希值也会是相同的。

MD5哈希函数的主要特点是它将任意长度的数据转换成一个固定长度的哈希值,并且理论上,不同的输入数据产生相同哈希值的概率非常低(尽管不是完全不可能)。因此,MD5常被用于验证文件的完整性,比如确保文件在传输过程中没有被篡改。

一、MD5的介绍

MD5的设计目标是快速且能够产生一个128位(16字节)的哈希值,通常表示为32位的十六进制字符串。MD5的数学原理主要基于以下几个方面:

1. 位操作:MD5使用基本的位操作,包括AND、OR、XOR、NOT以及位移操作。这些操作对输入数据的位进行处理,以产生哈希值。

2. 主循环结构:MD5算法的核心是一个循环结构,它将输入数据分成512位的块,并逐个处理这些块。每个块的处理包括四个主要的函数(F, G, H, I),这些函数使用不同的逻辑运算和常量。

3. 填充:在处理之前,原始数据需要被填充到一个合适的长度,通常是使其长度为448模512的倍数。填充方案是先添加一个1位,后面跟着若干个0位,最后是一个64位的原始数据长度表示。

4. 初始化向量:MD5算法开始时使用一个固定的128位初始化向量,这个向量在每次哈希计算时都会用到。

5. 消息调度:在每个512位的数据块中,MD5算法将数据分成16个32位的子块,并按照一定的顺序进行处理。

6. 非线性变换:MD5算法中的四个主要函数(F, G, H, I)是设计来提供非线性特性的,以增加算法的复杂性和抵抗线性攻击。

7. 迭代过程:MD5算法通过迭代过程,将数据块、常量和当前的哈希值结合起来,产生新的哈希值。这个过程在算法中重复多次,以确保哈希值的均匀分布。

8. 最终输出:经过一系列的迭代和变换后,算法最终输出一个128位的哈希值,通常以32位十六进制字符串的形式展示。

然而,MD5也有一些安全上的缺陷,它容易受到多种攻击,如碰撞攻击,因此在需要高安全性的场合,推荐使用更安全的哈希算法,如SHA-256。尽管如此,对于大多数非安全关键的应用,MD5仍然是一个快速且有效的选择。

二、常见的MD5哈希用途

1. 文件完整性校验:MD5可以用于验证文件是否在传输或存储过程中被篡改。通过比较文件的MD5哈希值,可以快速检测文件是否发生了变化。

2. 数据加密:虽然MD5不再推荐用于需要高安全性的加密场景,但在某些低安全需求的场合,它仍然被用于数据的加密和保护。

3. 密码存储:在某些系统中,MD5曾被用于存储用户密码的哈希值。然而,由于MD5容易受到彩虹表攻击,现在更推荐使用更安全的哈希算法,如bcrypt。

4. 数字签名:在数字签名中,MD5可以作为消息的摘要,与公钥一起验证消息的完整性和来源。

5. 数据索引:在数据库和搜索引擎中,MD5可以用于快速索引和检索数据。

6. 软件分发:软件包或安装程序的MD5值可以用于验证下载过程中的文件完整性。

7. 网络安全:在某些网络安全协议中,MD5用于生成会话密钥或进行数据的快速校验。

8. 区块链技术:在区块链中,MD5有时用于生成交易或区块的简短标识符。

9. 内容分发网络(CDN):CDN使用MD5来识别和缓存内容,以提高内容分发的效率。

10. 软件版本控制:软件版本控制系统中,MD5可以用于快速比较文件版本的差异。

三、hashlib库介绍

hashlib是 Python 的一个内置库,提供对各种不同哈希算法的支持,包括 MD5、SHA1、SHA256、SHA512 等。哈希算法是一种将任意长度的数据转换为固定长度的哈希值的方法,通常用于数据的完整性校验、密码存储、数据指纹等场景。

以下是 hashlib库的一些主要特点和使用方法:

1. 多种哈希算法:hashlib支持多种哈希算法,可以根据不同的安全需求选择适合的算法。

2. 简单易用的API:hashlib提供了简单直观的API,使得哈希计算变得非常容易。

3. 可读性和可写性:hashlib既可以处理二进制数据,也可以处理文本数据。对于文本数据,需要指定编码方式。

4. 更新模式:hashlib允许你使用 update()方法逐步更新哈希对象,这对于处理大文件或流数据非常有用。

5. 一次性计算:除了更新模式外,hashlib也支持一次性计算整个数据的哈希值。

6. 十六进制和二进制输出:hashlib可以以十六进制或二进制格式返回哈希值。

以下是使用 hashlib计算 MD5 和 SHA256 哈希值的示例代码:

import hashlib# 计算MD5哈希值
md5_hash = hashlib.md5()
md5_hash.update(b"Hello, World!")
print("MD5 hash:", md5_hash.hexdigest())# 计算SHA256哈希值
sha256_hash = hashlib.sha256()
sha256_hash.update(b"Hello, World!")
print("SHA256 hash:", sha256_hash.hexdigest())

其中使用 update()方法更新哈希对象的数据,最后使用 hexdigest()方法获取十六进制格式的哈希值。

四、实际应用-图片去重

实际应用,遍历指定目录中的所有图片文件,计算它们的MD5哈希值,并存储在字典中。如果发现相同的MD5值,只保留一个文件。

import os
import hashlibdef calculate_md5(file_path):"""计算文件的MD5哈希值"""hash_md5 = hashlib.md5()with open(file_path, "rb") as f:for chunk in iter(lambda: f.read(4096), b""):hash_md5.update(chunk)return hash_md5.hexdigest()def find_duplicate_images(directory):"""查找并删除具有相同MD5值的重复图片,只保留一个"""md5_dict = {}  # 存储MD5哈希值和对应文件路径的字典for root, dirs, files in os.walk(directory):for filename in files:if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):file_path = os.path.join(root, filename)md5 = calculate_md5(file_path)if md5 in md5_dict:# 如果MD5值已存在,则删除重复的文件os.remove(file_path)print(f"Removed duplicate image: {file_path}")else:# 否则,将文件路径添加到字典中md5_dict[md5] = file_path# 指定目录路径
directory_path = '/data/images'
find_duplicate_images(directory_path)

这篇关于图像去重技术:MD5哈希在自动化中的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064901

相关文章

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化: