日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MD5校验

發(fā)布時(shí)間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MD5校验 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

好久沒有寫隨筆了,正好這兩天可以休整一下,借此機(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é)

以上是生活随笔為你收集整理的MD5校验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。