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("按任意键退出")