好久没有写随笔了,正好这两天可以休整一下,借此机会总结下最近使用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. vnc远程linux服务器黑屏

    本来想尝试用vnc连接到linux服务器上,图形化操作一点东西,不过遇到了困难,记录方便查询. 1,打开vnc 选择Ip和端口,连接上去显示黑屏. 2,于是想到系统原先没有安装图像化桌面.so,  y ...

  2. 禁掉a链接的几种方法

    这次遇到链接 先留着  但不能有任何作用的需求  ,我只能说顾客的需求真是多种多样,奇奇怪怪啊 啊啊啊啊啊啊啊啊啊啊啊 我用span代替了a 标签,但是后来想想维护起来可能不太方便  所以上网查资料, ...

  3. Android SQLite的使用1(非原创)

    1.继承SQLiteOpenHelper :public class MyOpenHelper extends SQLiteOpenHelper {} 2.重写下面3个方法 package com.e ...

  4. OC——动态添加Button和监听UIAlertView按钮

    1:动态添加uibutton - (IBAction)addButton:(id)sender { CGRect frame = CGRectMake(90, 200, 200, 60); UIBut ...

  5. struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb

    在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...

  6. VS2003.NET在文件中查找卡死

    不知怎么的,安装vs2003后,一点查找就卡死. 修复方法:修改devenv.exe的兼容性配置,勾选“禁用视觉主题”! 说实话,还真不知道这两者有什么关系?

  7. yum添加源。

    本文以centos 7为准.其他版本的linux可能存在一些偏差. 第一:索引文件. 1)repo文件. 1.repo文件是指以repo为结尾的文件.是 仓库源的索引文件.将其添加到yum的repo仓 ...

  8. Javascript-数据类型、类型转换

    typeof 判断数据类型: var n = 1; var t = "echo"; var fn = function() {} var arr = [1,2,3]; typeof ...

  9. ios html5 长按复制文本

    以前做的项目,主要是针对ios的,安卓上面也没有测试. 原理其实是系统自带的功能,那时候借鉴的其他网站,没有试验通过document.execCommand("Copy"),别的j ...

  10. FatMouse' Trade(hdoj1009)

    Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...