图像去重技术: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)

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

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

相关文章

Golang | Leetcode Golang题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; func reverse(a []int) {for i, n : 0, len(a); i < n/2; i {a[i], a[n-1-i] a[n-1-i], a[i]} }func postorderTraversal(root *TreeNode) (res []int) {addPath : func(node *TreeNode) {resSize : len(res)for ; node ! nil; node n…

大语言模型QA

Q:关于 Yi-9B 通过 input/output cosine 来分析模型,可能文档里没有把前提说明白。该指标确实存在你们提到的不同模型大小不可比的问题。所以我们比较的是同一个模型在不同训练阶段,以及 layer 深度相同的dense models 之间的比较。除了发现yi-6B/34B 随着训练 tokens 的增加…

11.NiO多线程优化

场景 单线程配合一个selector选择器管理多个channel上的事件。 问题 1.多核cpu,如果是单线程就会让cpu的力量被浪费。 2.单线程处理多个事件,如果某个事件耗费时间比较久,就会影响其它事件的处理。 例如:redis单线程写的,底层网络用的类似于nio和selector方式编写,所…

Polkadot <> Kusama 桥:打造无信任互操作性的开创性范例

原文&#xff1a;https://www.parity.io/blog/trustless-interoperability 作者&#xff1a;Adrian Catangiu&#xff5c;Rust 区块链核心工程师&#xff0c;Parity Technologies 编译&#xff1a;OneBlock Polkadot <> Kusama 桥是无信任互操作性的开创性范例。本文深…

TCP相关细节

1. 常用TCP参数 1.1 ReceiveBufferSize ReceiveBuffersize指定了操作系统读缓冲区的大小&#xff0c; 默认值是8192(如图5-10 所示)。在第4章的例子中,会有"假设操作系统缓冲区的长度是8" 这样的描述,可通过socket.ReceiveBufferSize 8 实现。当接收端缓冲区满了的时…

C#面:C#构造器Constructor是否可以被继承?是否可以被Override?

C#构造器&#xff08;Constructor&#xff09;不能被继承&#xff0c;也不能被重写&#xff08;Override&#xff09;。 构造器是用于创建和初始化对象的特殊方法。它在对象创建时自动调用&#xff0c;并负责初始化对象的成员变量和执行其他必要的操作。构造器的名称与类名相同…

实用软件下载:XMind 2024最新安装包及详细安装教程

​XMind不仅是一款易用且功能强大的思维导图软件&#xff0c;也是一个开源项目。XMind以构建一个社区向全球提供领先的跨平台思维导图和头脑风暴软件为目标&#xff0c;以帮助用户提升效率。XMind公司是XMind开源项目的主要代码贡献者&#xff0c;与此同时&#xff0c;我们欢迎…

Stable Diffusion本地化部署详细攻略

一、硬件要求 内存&#xff1a;至少16GB 硬盘&#xff1a;至少60GB以上的磁盘空间&#xff0c;推荐SSD固态硬盘 显卡&#xff1a;推荐NVIDIA显卡 显存&#xff1a;至少4GB Stabl Diffusion因为是在本地部署&#xff0c;对显卡的要求比较高&#xff0c;如果经济能力可以的话…

AI大模型爆发,你还不学就晚了!抓住时代机遇,快速入门指南!

AI大模型风起云涌&#xff0c;你准备好乘风破浪了吗&#xff1f; 在一个阳光明媚的午后&#xff0c;小李坐在自己的工位上&#xff0c;眼前的代码如同繁星般繁多。他是一名资深的软件工程师&#xff0c;但在最近的技术浪潮中&#xff0c;他却感到了一丝不安。他的朋友圈里&…

ubuntu20.0.4下安装PyTorch

参考文档 https://datawhalechina.github.io/thorough-pytorch/%E7%AC%AC%E4%B8%80%E7%AB%A0/1.2%20PyTorch%E7%9A%84%E5%AE%89%E8%A3%85.html 1&#xff1a;安装Anaconda 登录Anaconda | Individual Edition&#xff0c;https://www.anaconda.com/download/success &#xff…

RN6752V1 高性能AHD转MIPIDVPBT656BT601芯片方案,目前适用于车载方案居多

RN6752V1描述&#xff1a; RN6752V1是一种模拟高清晰度&#xff08;模拟高清&#xff09;视频解码器IC&#xff0c;专为汽车应用而设计。它集成了所有必要的功能块&#xff1a; AFE&#xff0c;PLL&#xff0c;解码逻辑&#xff0c;MIPI和I2C接口等&#xff0c;在一个小的5mm …

在 Python 中创建具有当前日期和时间的文件名

在 Python 中使用当前日期和时间创建文件名的一种方法是使用 datetime 模块。 要在 Python 中格式化 datetime 对象&#xff0c;我们可以使用 strftime&#xff08;&#xff09; 方法&#xff0c;使用 strftime&#xff08;&#xff09; 方法创建格式化的日期时间字符串。 示…

LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等

前言 自ChatGPT为代表的大语言模型&#xff08;Large Language Model, LLM&#xff09;出现以后&#xff0c;由于其惊人的类通用人工智能&#xff08;AGI&#xff09;的能力&#xff0c;掀起了新一轮[自然语言处理]领域的研究和应用的浪潮。尤其是以ChatGLM、LLaMA等平民玩家都…

【ARM Cache 及 MMU 系列文章 6.5 -- 如何进行 Cache miss 统计?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 ARM Cache Miss 统计Cache 多层架构简介Cache 未命中的类型Cache 未命中统计Cache miss 统计代码实现Cache Miss 统计意义ARM Cache Miss 统计 在ARMv8/v9架构中,缓存未命中(Cache …

深度解析服务发布策略之金丝雀发布

目录 什么是金丝雀发布&#xff08;Canary Release&#xff09; 金丝雀发布的原理 金丝雀发布的优点 金丝雀发布的注意事项 金丝雀发布的实现步骤 小结 在软件开发和运维中&#xff0c;发布新版本是一个风险较高的操作。为了降低风险&#xff0c;提高发布的稳定性和可靠性…

人工智能在风险管理中的创新之路

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;尤其在风险管理领域&#xff0c;其展现出的巨大潜力令人瞩目。风险管理&#xff0c;作为一个涉及广泛领域的复杂系统&#xff0c;正逐渐依赖于AI技术来提升效率和准…

简单了解CPU的工作原理

目录 一、基本结构以及对应功能 &#xff08;1&#xff09;基本结构 &#xff08;2&#xff09;几个重要寄存器的详细介绍 操作码 (Opcode) 操作数 (Operands) 指令表 (Instruction Table) 第一个&#xff1a;程序计数器 (PC) 第二个&#xff1a;指令寄存器 (IR&#x…

【Arthas案例】某应用依赖两个GAV不同但包含两个相同全限定类名StaticLoggerBinder,引起log4j.Level类找不到异常

3分钟内解决问题 两个不同的GAV依赖冲突&#xff0c;包含相同全限定类名&#xff0c;引起ClassNotFoundException Maven依赖的三坐标体系GAV(G-groupId&#xff0c;A-artifactId&#xff0c;V-version) 【案例1】某应用依赖两个GAV不同的jar&#xff0c;但包含两个相同全限定类…

探索互联网寻址机制 | 揭秘互联网技术的核心,解析网络寻址

揭秘互联网技术的核心&#xff0c;解析网络寻址题 前提介绍局域网地址IP地址的分配方式动态IP分配机制内部网&#xff08;intranet&#xff09;ICANN负责IP分配DHCP协议获取IP地址 域名系统域名是什么域名工作方式hosts文件存储域名映射关系DNS分布式数据库DNS域名解析 Java进行…

Java中List流式转换为Map的终极指南

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 在Java编程中&#xff0c;经常需要将一个List对象转换为另一个Map对象。这可能是因为需要根据List中的元素的某些属性来创建一个新的键值对集合。在本文中&#xff0c;我将向您展示如何使用Java 中的流式API轻松地实…