计算文件校验码MD5/SHA1/SHA256,文件去重

简介

很多人下载一些软件的时候,可能在下载地址的旁边附带有 MD5 SHA1 SHA256 等一串字符串,这些字符串被称为哈希校验码,提供这些代码是可以用来验证用户从各种非官方渠道下载的软件是否是没被修改过的原版,从而防止软件被某些人进行篡改,夹带私货。

哈希简单理解就是采用设定好的算法对输入的数据(在此指文件内容)进行计算得到一串字符串输出结果的方法。使用的算法又称为哈希函数或哈希算法。

哈希计算是一种单向密码算法,即从明文到密文是不可逆的,只有加密过程,没有解密过程。哈希算法的结果通常很小,一般为 32位 或 64位 十六进制字符串等形式。哈希算法的特点之一是高灵敏性,也就是说输入数据的微小变化,哈希算法输出结果就会完全不同。

因此,如果官方原版的软件发布后被人为进行了修改,这种魔改版通过哈希算法计算得到的哈希值,与官方原版的哈希值是不同的。哈希算法可以用来校验接受者接收到的信息或数据的准确性。官方在发布软件的时候,可以同时发布该软件的哈希值,以便于用户辨别真伪是否官方原版。用户可以将下载软件通过哈希工具进行处理,将得到的哈希值与官方发布的哈希值进行比对,即可校验软件是否是被篡改过。

简单使用

  • 简单计算文件校验码可以使用微软Win系统自带CMD命令行,不需要安装其他工具,运行语法是:
certutil -hashfile filename MD5 //检验MD5
certutil -hashfile filename SHA1 //检验SHA1
certutil -hashfile filename SHA256 //检验SHA256

其中 filename 是要校验的文件名称,后面是哈希算法名,支持的哈希算法包括 MD2、MD4、MD5、SHA1、SHA256、SHA384、SHA512 , //以及后面是注释说明,使用时不需要输入。

基于文件校验码实现文件去重

完整代码

  • GitHub链接

计算文件校验码

import hashlib

def encrypt(fpath: str, algorithm: str) -> str:
    with open(fpath, 'rb') as f:
        return hashlib.new(algorithm, f.read()).hexdigest()

文件去重

def find_and_remove_repeat(file_dir: str, algorithm: str) -> None:
    file_names = get_file_list(file_dir)
    file_dict = {}

    for file_path in file_names:
        hexdigest = encrypt(file_path, algorithm)
        key = '{}'.format(hexdigest)
        if key in file_dict:
            file_dict[key].append(file_path)
        else:
            file_dict[key] = [file_path]

    print("==> The Same Files: ")
    for _, files in file_dict.items():
        if len(files) > 1:
            print("=> Keep: \n" + files[0])
            print("=> Remove: ")
            for file in files[1:]:
                print(file)
                os.remove(file)
if __name__ == '__main__':
    img_dir = '../output/word'
    # 'md5', 'sha1', 'sha256'
    algorithm = 'md5'
    # Find the same file and delete the same file
    find_and_remove_repeat(img_dir, algorithm)

你可能感兴趣的:(python,算法,python)