電腦經過長時間的使用,難免會存留許多重複檔案。這些重複檔案往往四散在各處,其檔名、修改時間等資訊都有改動,這對我清理重複檔案造成了困擾。儘管重複檔案已經有了諸多修改,但是這些修改僅僅作用於檔案頭,真正的檔案資料沒有修改過,因此我可以通過比較磁碟上的檔案的檔案資料,來找到重複的檔案。
為了查詢重複檔案,我需要比較檔案的檔案資料。我比較兩個檔案異同,通常做法是讀入兩個檔案的資料到記憶體,然後一一比對。如果我有大批量檔案要查重,讀入所有檔案到記憶體是不可取的方法。如果我不需要獲取檔案之間的差別資訊,而是用較小的摘要資訊,來辨別兩個檔案是否完全相同,那麼我們可以讀入所有檔案的摘要資訊來比較檔案異同,就是可行的。生成摘要資訊的技術有md5,sha-1等,這裡我們使用常見的md5技術:
md5即message-digest algorithm 5(資訊-摘要演算法5),用於確保資訊傳輸完整一致。是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、雜湊演算法),主流程式語言普遍已有md5實現。將資料(如漢字)運算為另一固定長度值,是雜湊演算法的基礎原理。從md5的資料可以知道,兩個檔案的資料就算有一丁點差異,生成的md5碼都有很大差別,因此只能用md5碼來找完全相同的檔案,而不能找相似的檔案。md5演算法具有以下特點:
1、壓縮性:任意長度的資料,算出的md5值長度都是固定的。
2、容易計算:從原資料計算出md5值很容易。
3、抗修改性:對原資料進行任何改動,哪怕只修改1個位元組,所得到的md5值都有很大區別。
4、強抗碰撞:已知原資料和其md5值,想找到乙個具有相同md5值的資料(即偽造資料)是非常困難的。
python語言的hashlib庫已經帶有簡單方便的md5生成器,生成的md5與檔案頭無關。我可以用python的os.path.walk函式找到我需要查重的檔案集合,然後逐一生成md5碼。由於重複檔案之間的路徑可能相隔很遠,我們需要根據md5碼的結果對檔案進行排序。重複檔案由於md5碼相同,排序之後就緊鄰在一起,於是我就找到了相同的檔案。除了排序之外,我還可以使用python的defaultdict字典資料結構,在生成md5的同時構建好有序字典。defaultdict類似於c++的multimap,每乙個key可以對應多個value。我設定md5碼為defaultdict的key,檔案路徑為value。如果多個檔案生成同乙個md5碼,那麼該md5在defaultdict中對應的value就包含這些重複檔案的路徑。遍歷構建好的defaultdict,我們就找到了所有的重複檔案。
檔案md5加密
計算檔案的 md5 值 要計算 md5 值的檔名和路徑 md5 值16進製制字串 public static string md5file string filename 計算檔案的雜湊值 要計算雜湊值的檔名和路徑 演算法 sha1,md5 雜湊值16進製制字串 public static stri...
檔案MD5校驗
1.什麼是md5 md5訊息摘要演算法 英語 md5 message digest algorithm 一種被廣泛使用的密碼雜湊函式,可以產生出乙個128位 16位元組 的雜湊值 hash value 用於確保資訊傳輸完整一致。md5由美國密碼學家羅納德 李維斯特 ronald linn rives...
python 通過md5檢查並刪除重複檔案
usr bin python3 coding utf 8 time 8 21 2020 2 41 pm author jet li email robo jet qq.com file md5 check.py software pycharm import os import hashlib fr...