使用哈希函数删除哈希值相同的文件

哈希函数及哈希值的定义

        哈希函数是一种将任意长度的输入数据映射为固定长度的输出数据的函数。它通过对输入数据执行一系列复杂的数学运算,将数据转换为固定长度的唯一标识,这个唯一标识就是哈希值。

哈希函数的作用

  1. 数据唯一性: 对于不同的输入数据,哈希函数应该生成不同的哈希值,以便能够区分不同的数据
  2. 数据完整性: 任意微小的数据变化都应该导致不同的哈希值,这使得哈希函数被广泛用于数据完整性校验
  3. 快速访问: 哈希函数应该能够快速计算出哈希值,使其适用于快速数据检索和比较

计算哈希值

  1. 数据分块:首先,输入数据被分成固定大小的数据块。这有助于处理大量数据,并使得哈希函数能够逐步处理数据而不必一次性加载所有数据

  2. 初始变量设定:哈希函数会初始化一些内部变量或状态,这些变量在整个哈希计算过程中会被更新

  3. 数据转换:每个数据块经过一系列复杂的数学运算,如位运算、位移、逻辑运算、加法、乘法等,以及特定的哈希算法(如MD5、SHA-1、SHA-256等)中定义的算法操作。这些运算会混淆和转换数据块的内容

  4. 迭代处理:对于大文件或大量数据,哈希函数通常会迭代处理每个数据块,逐步更新内部状态和哈希值

  5. 压缩:在处理完所有数据块后,哈希函数会执行最终的压缩操作,将内部状态转换为固定长度的输出,即哈希值

  6. 生成哈希值:最终生成的哈希值是一个固定长度的二进制串或十六进制串,用于唯一标识输入数据。即使输入数据的细微变化,也会导致生成的哈希值完全不同,这就是哈希函数的唯一性

删除哈希值相同的文件

  1. 计算文件的哈希值:使用哈希函数(如MD5、SHA-1、SHA-256等)计算每个文件的哈希值
  2. 识别重复的哈希值:将计算出的哈希值存储在一个数据结构(如字典)中,检查是否有重复的哈希值
  3. 删除重复文件:对于具有相同哈希值的文件,保留其中一个,删除其他重复文件

代码示例

以下是python示例代码,用于删除具有相同哈希值的文件:

import os
import hashlib## 适用于大文件
def file_hash_1(file_path):hasher = hashlib.md5()with open(file_path, 'rb') as f:for chunk in iter(lambda: f.read(4096), b""):hasher.update(chunk)return hasher.hexdigest()## 适用于小文件
def file_hash_2(filepath):with open(filepath, 'rb') as f:return hashlib.md5(f.read()).hexdigest()def find_and_remove_duplicate_files(directory):hash_dict = {}for root, _, files in os.walk(directory):for file in files:file_path = os.path.join(root, file)file_hash_value = file_hash_1(file_path)# file_hash_value = file_hash_2(file_path)if file_hash_value in hash_dict:os.remove(file_path)print(f"Deleted duplicate file: {file_path}")else:hash_dict[file_hash_value] = file_pathdirectory_to_search = "path/to/directory"
find_and_remove_duplicate_files(directory_to_search)

其中,

file_hash_1函数使用了迭代方式读取文件内容,并在每次读取的数据块上更新哈希值。它遍历文件的内容块(每次读取4096字节),并更新哈希对象,直到整个文件都被处理完毕。这种方法适用于处理大文件,因为它可以逐步读取文件内容而不会一次性加载整个文件到内存中。

file_hash_2函数直接将整个文件内容读入内存,然后计算其哈希值。它一次性将整个文件读取到内存中,然后计算哈希值。这种方法适用于处理较小的文件,因为它会一次性加载整个文件到内存中,可能会导致内存占用较高。

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

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

相关文章

Java面试题:volatile专题

王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是《面霸的自我修养》第4篇文章,我们一起来看看面试中会问到哪些关于volatile的问题吧。数据来源: 大部分来自于各机构(Java之父,Java继父,某灵,某泡,某客)以及各博主整理文档…

Java程序中为什么要使用StringBuilder

遇到这个问题是来源于leetcode的一道题&#xff1a;字符串解码。其中的题解涉及字符串的操作使用的是StringBuilder&#xff0c;不是String。 class Solution {public String decodeString(String s) {StringBuilder res new StringBuilder();int multi 0;LinkedList<Int…

MR专题:体验Apple Vision Pro多元生态内容,拥抱MR供应链机遇

今天分享的是MR系列深度研究报告&#xff1a;《MR专题&#xff1a;体验Apple Vision Pro多元生态内容&#xff0c;拥抱MR供应链机遇》。 &#xff08;报告出品方&#xff1a;方正证券&#xff09; 报告共计&#xff1a;15页 来源&#xff1a;人工智能学派 Apple Vision Pro…

基因富集分析——GO/DO

DO&#xff08;Disease Ontology&#xff09;分析涉及多种具体的步骤和方法&#xff0c;下面是一些常见的DO分析步骤或方法&#xff1a; 1. 疾病分类和定义&#xff1a;分析DO中的疾病分类体系&#xff0c;理解不同疾病之间的关系和归类。这包括查看DO本体中的层次结构、疾病之…

本地TCP通讯(C++)

概要 利用TCP技术&#xff0c;实现本地ROS1和ROS2的通讯。 服务端代码 头文件 #include <ros/ros.h> #include "std_msgs/String.h" #include "std_msgs/Bool.h" #include <iostream> #include <cstring> #include <unistd.h>…

消息队列-RabbitMQ:workQueues—工作队列、消息应答机制、RabbitMQ 持久化、不公平分发(能者多劳)

4、Work Queues Work Queues— 工作队列 (又称任务队列) 的主要思想是避免立即执行资源密集型任务&#xff0c;而不得不等待它完成。我们把任务封装为消息并将其发送到队列&#xff0c;在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时&#xff0c;这些工作…

AVEC-为编译后的可执行程序添加资源

AVEvasionCraftOnline 一个在线免杀的web端程序&#xff0c;可以绕过常见杀软 项目地址&#xff1a;https://github.com/yutianqaq/AVEvasionCraftOnline AVEvasionCraftOnline - 小更新 sha256sum AVEvasionCraftOnline.jar AVEvasionCraftOnline-v1.1.zip 896387a21946b1…

vulnhub练习 DC-1复现及分析

一、搭建环境 1.工具 靶机&#xff1a;DC-1 192.168.200.17 攻击机&#xff1a;kali 192.168.200.13 2.注意 攻击机和靶机的网络连接方式要相同&#xff0c;另外DC-1的网络连接方式我这里采用NAT模式&#xff0c;是与kali的网络连接模式相同的&#xff08;当然亦可以选用桥…

前端使用QGIS工具生成地图

1 找到所需要地图的 json 数据 1.1 查找 json 数据的两个网址&#xff08;个人常用&#xff09; 1.1.1 DataV.GeoAtlas 网站 DataV.GeoAtlas 这个网站不能具体到县内包含的城镇分化&#xff0c;但是对于县级以上的地图数据&#xff0c;使用起来很方便。 1.1.2 POI数据 网站 …

创作无版权素材:解放创意的利器

title: 创作无版权素材&#xff1a;解放创意的利器 date: 2024/2/21 13:52:09 updated: 2024/2/21 13:52:09 tags: 无版权创作自由法律合规节省成本提升质量多样素材创意工具 在当今数字化时代&#xff0c;内容创作成为了一种非常重要的方式来传达信息和表达创意。 然而&#…

【在 Windows 系统上开发 Flutter 项目并将其发布到 Ubuntu 服务器】

在 Windows 系统上开发 Flutter 项目并将其发布到 Ubuntu 服务器上&#xff0c;按照以下步骤进行操作&#xff1a; 构建 Flutter Web 应用&#xff1a; 在 Windows 系统上&#xff0c;进入Flutter 项目目录&#xff0c;然后运行 flutter build web 命令来构建你的 Flutter Web …

常见锁策略以及CAS

目录 1.1乐观锁&悲观锁 1.2轻量级锁&重量级锁 1.3自旋锁&挂起等待锁 1.4互斥锁&读写锁 1.5可重入锁&不可重入锁 1.6公平锁&非公平锁 1.7synchronized的特点 2.CAS(Compare and swap) 2.1.是什么 2.2.基于CAS方式实现的线程安全优缺点 2.3.使用场景…

设计模式----工厂模式

工厂模式 工厂模式即建立创建对象的工厂&#xff0c;实现创建者和调用者分离。 简单工厂模式&#xff1a;该模式对对象创建管理方式最为简单&#xff0c;因为他简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象。 工厂方法模式&am…

JVM对象的创建流程与内存分配

对象的创建流程与内存分配 创建流程对象内存分配方式内存分配安全问题对象内存分配流程【重要】:对象怎样才会进入老年代?重点 案例演示:对象分配过程大对象直接进入老年代02-对象内存分配的过程: 创建流程 加载 验证 解析 准备 初始化 使用 写在 对象内存分配方式 内存分配…

过滤器:Gateway GlobalFilter在分布式系统中的应用

在Spring Cloud Gateway中&#xff0c;GlobalFilter接口允许你创建全局过滤器&#xff0c;这意味着该过滤器会应用到所有的路由上&#xff0c;无论它们是否匹配特定的路由规则。Ordered接口用于定义过滤器的执行顺序。 以下是一个AuthFilter类的示例&#xff0c;该类实现了Glo…

GPT-SoVITS-WebUI 克隆声音 macos搭建

强大的少样本语音转换与语音合成Web用户界面 macos运行参考 macos conda create -n GPTSoVits python3.9 conda activate GPTSoVits激活环境 conda activate GPTSoVits停用 conda deactivate mkdir GPTSoVits cd GPTSoVits git clone https://github.com/RVC-Boss/GPT-SoVITS…

算法项目(1)—— LSTM+CNN+四种注意力对比的股票预测

本文包含什么? 项目运行的方式(包教会)项目代码(在线运行免环境配置)不通注意力的模型指标对比一些效果图运行有问题? csdn上后台随时售后.项目说明 本项目实现了基于CNN+LSTM构建模型,然后对比不同的注意力机制预测股票走势的效果。首先看一下模型结果的对比: 模型MS…

深度学习基础之《TensorFlow框架(6)—张量》

一、张量 1、什么是张量 张量Tensor和ndarray是有联系的&#xff0c;当我们print()打印值的时候&#xff0c;它返回的就是ndarray对象 TensorFlow的张量就是一个n维数组&#xff0c;类型为tf.Tensor。Tensor具有以下两个重要的属性&#xff1a; &#xff08;1&#xff09;typ…

2024年2月的TIOBE指数,go语言排名第8,JAVA趋势下降

二月头条&#xff1a;go语言进入前十 本月&#xff0c;go在TIOBE指数前10名中排名第8。这是go有史以来的最高位置。当谷歌于2009年11月推出Go时&#xff0c;它一炮而红。在那些日子里&#xff0c;谷歌所做的一切都是神奇的。在Go出现的几年前&#xff0c;谷歌发布了GMail、谷歌…

枚举类(enum)

优质博文&#xff1a;IT-BLOG-CN ​ 枚举类&#xff1a; 就是对象的实例个数是确定的&#xff08;例如&#xff1a;单例模式&#xff09;&#xff0c;也就说我们在创建枚举类的时候&#xff0c;会对构造器进行设置 一、自定义创建枚举类 为什么需要枚举类&#xff1f; 【1】…