MD5值重复文件多进程检查工具check_md5.py - 性能测试工具开发

python测试开发项目实战-目录

MD5简介

Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

MD5算法具有以下特点:

1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

2、容易计算:从原数据计算出MD5值很容易。

3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。

举个实际应用的例子。比如你在百度云qq群文件等上传文件的时候,有时上传几百兆的文件可以几秒内完成,是真的网络有这么快么?不是,通常是服务器已经存在你所上传的文件。那么系统是如何确定服务器已经存在你要上传的文件的呢?多为计算你要上传文件的MD5,如果MD5和已有文件的MD5一致,就认为文件已经存在。

参考资料

计算MD5

linux 下 shell命令行工具md5sum用于计算与校验RFC 1321所描述的128位MD5哈希值。

$ echo "hello" > hello
$ md5sum hello 
b1946ac92492d2347c6235b4d2611184  hello

上述过程也可以用python3实现

>>> import hashlib
>>> hashlib.md5(open('hello','rb').read()).hexdigest()
'b1946ac92492d2347c6235b4d2611184'

上述代码的函数封装,参见get_md5函数。

[Md5sum 英文维基百科参考](https://en.wikipedia.org/wiki/Md5sum

MD5值重复文件多进程检查工具

测试过程中经常发现MD5值相同的图片。之前没有用并发,检查过程经常需要一个小时,现在改成多进程。一般3分钟以内可以完成处理(48核)。

此模式也是自行开发性能测试工具的模型之一。

代码:


#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author:    xurongzhong#126.com 技术支持qq群:144081101
# CreateDate: 2018-1-8 
# check_md5.py

import multiprocessing
from pathlib import Path
import argparse
import os

import data_common

def consumer(queue, results, lock):
    while True:
        item = queue.get()
        if item is None:
            break        
        name = os.path.basename(item)
        md5 = data_common.get_md5(item, is_file=True)
        
        with lock:
            if md5 in results:
                print("Same md5", results[md5], name)
            else:
                results[md5] =[]
            results[md5] = results[md5] + [name]


if __name__ == '__main__':
    
    parser = argparse.ArgumentParser()
    parser.add_argument('directory', action="store", help=u'目录')
    parser.add_argument('-t', action="store", dest="typename",
                        default="*", help=u'文件扩展名')
    parser.add_argument('--version', action='version',
                        version='%(prog)s 1.1 Rongzhong xu 2018 03 22')
    options = parser.parse_args()
    
    process = []
    queue = multiprocessing.Queue()
    results = multiprocessing.Manager().dict()
    lock = multiprocessing.Lock()
    if multiprocessing.cpu_count() < 3:
        number = multiprocessing.cpu_count()
    else:
        number = multiprocessing.cpu_count() - 1
    
    # Launch the consumer process
    for i in range(number):
        t = multiprocessing.Process(
            target=consumer,args=(queue, results, lock))
        t.daemon=True
        process.append(t)
    
    for i in range(number):
        process[i].start()
    
    p = Path(options.directory)   
    for item  in p.glob('**/*.{}'.format(options.typename)):
        queue.put(str(item))
        
    for i in range(number):
        queue.put(None) 
        
    for i in range(number):
        process[i].join()       
       
    f = open("md5_files.txt",'w')   
    f2 = open("files.txt",'w')   
    for item in dict(results):
        f2.write("{},{}\n".format(item,results[item]))
        if len(results[item]) > 1:
            f.write("{},{}\n".format(item,results[item]))

演示

#!python
$ python3 check_md5.py /home/andrew/code/paper
Same md5 ['2018.01.07-19.38.15_0.9999967.jpg'] 2018.01.07-19.38.15_0.99999679.jpg
$ cat md5_files.txt 
43c5a6e1dcf79d095e97ce63885c5cd7,['2018.01.07-19.38.15_0.9999967.jpg', '2018.01.07-19.38.15_0.99999679.jpg']
andrew@andrew-PowerEdge-T630:~/code/mobile_data/tools$

注意,求MD5值依赖data_common.py

上面使用的多进程属于python高性能的内容,如需想深入了解可以参考书籍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容