好久没有写随笔了,正好这两天可以休整一下,借此机会总结下最近使用python的小体会。

个人体会文件校验在下载文件时使用较多,在linux下最简单的实现方式就是:

1 $ md5sum filename
2 21c7ee192e64569ce43cfb869bdb2755 filename

当然在python当中也有对应的模块可以实现此功能,在python2.5之前可以使用 md5 模块,但是在python2.5以后就推荐使用 hashlib 来代替 md5 模块了。最简单的实现代码如下:

#!/usr/bin/env python
#coding : utf-8 import sys
import hashlib def md5sum(filename):
file_object = open(filename, 'rb')
file_content = file_object.read()
file_object.close()
file_md5 = hashlib.md5(file_content)
return file_md5 if __name__ == "__main__":
file_md5 = md5sum(sys.argv[1])
print file_md5.hexdigest()

一个是传入 hashlib.md5() 的应该是 file_object.read() ,这样才是对文件内容产生md5校验码,竹风刚开始就是没有使用 read() 方法,而是传入filename(这样的md5是对文件名生成的),导致产生的校验码不对;
    另外一个地方是,调用了 hashlib.md5() 后返回的是一个对象,想要获得 linux 下 md5sum 同样的效果,还要调用一下 hexdigest() 方法。

当然,上面的代码考虑得不够周全。如果要对一个比较大的文件进行校验,将会把文件内容一次读入内存,造成性能上的缺陷。个人比较推荐从http://ryan-liu.iteye.com/blog/1530029提供的代码,代码如下:

#!/usr/bin/env python
#coding : utf-8
import hashlib, os def md5hex(word):
""" MD5加密算法,返回32位小写16进制符号
"""
if isinstance(word, unicode):
word = word.encode("utf-8")
elif not isinstance(word, str):
word = str(word)
m = hashlib.md5()
m.update(word)
return m.hexdigest() def md5sum(fname):
""" 计算文件的MD5值
"""
def read_chunks(fh):
fh.seek(0)
chunk = fh.read(8096)
while chunk:
yield chunk
chunk = fh.read(8096)
else: #最后要将游标放回文件开头
fh.seek(0)
m = hashlib.md5()
if isinstance(fname, basestring) \
and os.path.exists(fname):
with open(fname, "rb") as fh:
for chunk in read_chunks(fh):
m.update(chunk)
#上传的文件缓存 或 已打开的文件流
elif fname.__class__.__name__ in ["StringIO", "StringO"] \
or isinstance(fname, file):
for chunk in read_chunks(fname):
m.update(chunk)
else:
return ""
return m.hexdigest()

还可以用:

    # 大文件的MD5值
def getFileMd5(self, filename):
if not os.path.isfile(filename):
return
myhash = hashlib.md5()
f = file(filename, 'rb')
while True:
b = f.read(8096)
if not b:
break
myhash.update(b)
f.close()
return myhash.hexdigest()

PS:至于为什么是8k?这个就涉及到了IO大小方面的内容了。提供一篇文章,有兴趣的可以看看了解下:http://blog.sina.com.cn/s/blog_6200c1440100vt4z.html

转载:http://www.cnblogs.com/PandaBamboo/archive/2013/05/10/3071233.html

MD5校验的更多相关文章

  1. C# 获取文件MD5校验码

    using System; using System.IO; using System.Security.Cryptography; using System.Text; public class M ...

  2. 文件MD5校验

    1. 以前记得是在 msdn.itellyou.cn 上下载的 MD5 校验工具,应该是 IHasher,但是现在 msdn.itellyou.cn 上搜不到这个工具了... 2.

  3. 三、Socket之UDP异步传输文件-多文件传输和文件MD5校验

    本文接着上一篇文章二.Socket之UDP异步传输文件,在上一篇文章的基础上实现多文件的传输和文件传输完成后进行完整性校验. 要实现多文件的传输,必须要对文(2)中发送文件的数据格式进行改进,必须加入 ...

  4. Java 获取 文件md5校验码

    讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个 ...

  5. MD5校验及其c实现

    那么MD5校验是什么? 一般软件或者说文件都有自己的固定文件格式或者架构信息,说简单一点就是.”世界上没有完全相同的2片叶子” ,因为MD5是一种不可逆的加密算法. 那么对于某些网上公开下载的软件,视 ...

  6. Shell 对整个文件夹中的文件进行MD5校验 [转]

    查看本地文件的 MD5 命令:md5sum FileName查看home目录下所有文件的 MD5 码:cd ~find /home -type f -print0 | xargs -0 md5sum ...

  7. python tcp黏包和struct模块解决方法,大文件传输方法及MD5校验

    一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...

  8. Python socket文件传送md5校验

    soket_server import socket,os,hashlib server = socket.socket() server.bind(('0.0.0.0',9999)) server. ...

  9. apk文件md5校验之用好压对下载服务器测试[测试篇]

    往往稍微有点规模的公司,都会有一个独立下载服务器,那么,我还是简单说一下下载服务器的原理吧,首先后台上传文件或软件,然后web服务器通过定时脚本检测,如有变化,则将文件同步出去到下载服务器,源站数据库 ...

随机推荐

  1. andorid 控件 Bootstrap3.0风格的控件 精美UI控件库

    Bootstrap是Twitter推出的一个开源的用于前端开发的工具包.它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架.Bootstra ...

  2. java学习之部分笔记

    1.枚举类型 2.String的方法Index的用法.StringBuffer 的用法.Math的用法.Date类 3.用abstract修饰的类就是抽象类.抽象方法不能有主体.抽象类中,可以有抽象方 ...

  3. 嵌套iframe中的HTML的文档解析类型

    问题:页面整个刷新时,IE11输入框显示的宽度和高度正常,对页面中的iframe部分刷新时,IE11输入框的宽度和高度就变小了. 原因:网页的头部定义了文档类型<!DOCTYPE html> ...

  4. iOS基本内存管理:autorelease和autoreleasepool

    1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自 ...

  5. Lua编译

    编译lua包含3部分内容:lua库文件(lua*.lib),lua解释器(lua.exe),lua编译器(luac.exe) 首先: 下载源代码,编译批处理(以5.2.3为例): cd srccl / ...

  6. mysql 建表、查表、查表结构

    进入数据库: mysql> use sunshine_blog;输出: Database changed 查数据库表: mysql> show tables;输出: +---------- ...

  7. 认识JSONP

    jsonp 全称是JSON with Padding 我们大家都知道ajax是不能发起跨域请求,现在可以通过jsonp来弥补ajax的这一缺陷 通过script标签的src属性就可以实现跨域请求.如( ...

  8. 国内好用的公用DNS 服务器。

    阿里 AliDNS 223.5.5.5 223.6.6.6 CNNIC SDNS 1.2.4.8 210.2.4.8 Google DNS 8.8.8.8 8.8.4.4 OpenDNS 208.67 ...

  9. PHP设计模式之委托模式

    委托模式: 通过分配或委托至其他对象,委托设计模式能够去除核心对象中的判决和复杂的功能性. class Bank{ protected $info; /* 设置基本信息 @param string $ ...

  10. Oracle EBS-SQL (INV-9):检查搬运单分配异常.sql

    select h.request_number,         l.line_number,         msib.segment1 item_code,         t.transacti ...