MD5校验
好久沒有寫隨筆了,正好這兩天可以休整一下,借此機(jī)會總結(jié)下最近使用python的小體會。
??? 個(gè)人體會文件校驗(yàn)在下載文件時(shí)使用較多,在linux下最簡單的實(shí)現(xiàn)方式就是:
1 $ md5sum filename 2 21c7ee192e64569ce43cfb869bdb2755 filename???? 當(dāng)然在python當(dāng)中也有對應(yīng)的模塊可以實(shí)現(xiàn)此功能,在python2.5之前可以使用 md5 模塊,但是在python2.5以后就推薦使用 hashlib 來代替 md5 模塊了。最簡單的實(shí)現(xiàn)代碼如下:
#!/usr/bin/env python #coding : utf-8import sys import hashlibdef md5sum(filename):file_object = open(filename, 'rb')file_content = file_object.read()file_object.close()file_md5 = hashlib.md5(file_content)return file_md5if __name__ == "__main__":file_md5 = md5sum(sys.argv[1])print file_md5.hexdigest()?
?
??? 一個(gè)是傳入 hashlib.md5() 的應(yīng)該是 file_object.read() ,這樣才是對文件內(nèi)容產(chǎn)生md5校驗(yàn)碼,竹風(fēng)剛開始就是沒有使用 read() 方法,而是傳入filename(這樣的md5是對文件名生成的),導(dǎo)致產(chǎn)生的校驗(yàn)碼不對;
??? 另外一個(gè)地方是,調(diào)用了 hashlib.md5() 后返回的是一個(gè)對象,想要獲得 linux 下 md5sum 同樣的效果,還要調(diào)用一下 hexdigest() 方法。
??? 當(dāng)然,上面的代碼考慮得不夠周全。如果要對一個(gè)比較大的文件進(jìn)行校驗(yàn),將會把文件內(nèi)容一次讀入內(nèi)存,造成性能上的缺陷。個(gè)人比較推薦從http://ryan-liu.iteye.com/blog/1530029提供的代碼,代碼如下:
#!/usr/bin/env python #coding : utf-8 import hashlib, osdef md5hex(word):""" MD5加密算法,返回32位小寫16進(jìn)制符號"""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):""" 計(jì)算文件的MD5值"""def read_chunks(fh):fh.seek(0)chunk = fh.read(8096)while chunk:yield chunkchunk = fh.read(8096)else: #最后要將游標(biāo)放回文件開頭 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):returnmyhash = hashlib.md5()f = file(filename, 'rb')while True:b = f.read(8096)if not b:breakmyhash.update(b)f.close()return myhash.hexdigest()?
PS:至于為什么是8k?這個(gè)就涉及到了IO大小方面的內(nèi)容了。提供一篇文章,有興趣的可以看看了解下:http://blog.sina.com.cn/s/blog_6200c1440100vt4z.html
?
轉(zhuǎn)載:http://www.cnblogs.com/PandaBamboo/archive/2013/05/10/3071233.html
轉(zhuǎn)載于:https://www.cnblogs.com/zhjsll/p/5897443.html
總結(jié)
- 上一篇: 深入理解计算机系统 第三部分程序间的交互
- 下一篇: 《第9章 循环结构进阶》