基于MD5的文件查重程序

MD5简介

        MD5的全称是Message-Digest Algorithm 5,中文意思是消息摘要算法5。它是计算数据签名的一种密码散列函数。

程序设计流程

    1.读取目录下所有文件

    2.计算文件的MD5值

    3.查找重复MD5值

    4.删除重复MD5值的文件

主要优点:

  • 计算速度快,支持大规模文件查重。

  • 只存储MD5值不泄露原始内容。

  • 可以识别文件内容添加空格、改变格式后是否相同。

缺点

  • MD5本身不再安全,理论上可能存在碰撞。

  • 无法识别部分内容修改后的文件。

程序代码

import hashlib                  #导入哈希算法库
import os                       #导入文件操作功能库
from collections import Counter #导入计数器模块

#获取文件MD5哈希值
def Get_MD5_Checksum(File_Path):
    MD5 = hashlib.md5()         #获取MD5算法对象
    with open(File_Path, 'rb') as file:
        for chunk in iter(lambda: file.read(4096), b''):
            MD5.update(chunk)
    return MD5.hexdigest()

if __name__ == '__main__':
    checksum = []           #哈希值缓存
    emptyDict = {}          #所有文件及哈希值
    Duplicate_File = []     #重复文件

    file = [f for f in os.listdir() if os.path.isfile(f)]   #查找所有文件

    for Count_i in range(len(file)):
        checksum.append(Get_MD5_Checksum(file[Count_i]))    #计算哈希值
        emptyDict[file[Count_i]] = checksum[Count_i]        #将每个文件名与哈希值匹配
    Counter_value = Counter(checksum).most_common()         #计算重复哈希值数

    for Count_j in range(len(Counter_value)):
        Counter_File = Counter_value[Count_j][1]            #获取单哈希值的重复文件数
        if int(Counter_File) > 1:                           #对重复文件进行处理
            print("重复的文件名为:  ",end="")
            for key, value in emptyDict.items():
                if Counter_value[Count_j][0] == value:      #字典通过值找键
                    print(key+"  ",end="")
                    Counter_File -= 1
                    if(Counter_File):                       #重复文件只保留一个
                        Duplicate_File.append(key)          #将重复的文件名添加到列表
            print("")

    if(Counter_value[0][1] > 1):                #判断是否有重复文件
        Input = input("是否删除重复文件(Y/N)")
        if (Input == 'y') | (Input == 'Y'):     #根据用户输入来删除文件
            print("已删除:",end="")
            print(Duplicate_File)
            for Count_k in range(len(Duplicate_File)):  #删除重复文件列表中文件
                os.remove(Duplicate_File[Count_k])
    else:
        print("未找到重复文件")
    input("按任意键退出")

程序运行效果

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MD5 (Message Digest Algorithm 5) 是一种常用的文件完整性校验算法,通过对任意长度的输入数据进行计算,得到一个固定长度的哈希值,用于判断文件的完整性。 要基于C语言实现MD5算法的文件完整性校验程序,可以按照以下步骤进行: 1. 引入相关的头文件和定义必要的常量和数据结构。 2. 实现MD5算法的核心函数,包括四个轮函数(F、G、H、I),以及每轮中的16个变换操作。主要包括:填充原始数据、分组处理、压缩函数、循环左移、数据处理和最后的哈希值输出等步骤。 3. 实现对文件内容的读取和分组处理,可以通过打开文件、循环读取文件内容,每次读取一个固定长度的字节,将读取到的字节作为输入,传递给MD5算法的处理函数。 4. 在主函数中实现对文件的打开和校验过程,首先读取文件的内容,然后将其中的数据传递给MD5算法的处理函数,最后将计算得到的哈希值与预先计算好的预期哈希值进行比较,以判断文件的完整性。 5. 输出校验结果,如果计算得到的哈希值与预期哈希值相同,表示文件完整性校验通过,否则表示文件被篡改或损坏。 需要注意的是,为了程序的实用性,可以进一步封装MD5算法的相关函数和操作,使得程序更易于使用和扩展。此外,在实际应用中,也可以将MD5算法与其他校验算法结合使用,提高校验的准确性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值