Python比较本地和远程文件MD5哈希

fra*_*axa 4 python hash checksum md5

我正在尝试比较本地和远程文件 MD5 哈希(我在 wamp“www”目录中复制/粘贴的同一个文件),但我不明白为什么“校验和”不对应......

这是校验和代码:

#-*- coding: utf-8 -*-

import hashlib
import requests

def md5Checksum(filePath,url):
    if url==None:
        with open(filePath, 'rb') as fh:
            m = hashlib.md5()
            while True:
                data = fh.read(8192)
                if not data:
                    break
                m.update(data)
            return m.hexdigest()
    else:
        r = requests.get(url, stream=True)
        m = hashlib.md5()
        for line in r.iter_lines():
            m.update(line)
        return m.hexdigest()

print "checksum_local :",md5Checksum("projectg715gb.pak",None)
print "checksum_remote :",md5Checksum(None,"http://testpangya.ddns.net/projectg715gb.pak")
Run Code Online (Sandbox Code Playgroud)

我很惊讶得到这个输出:

checksum_local : 9d33806fdebcb91c3d7bfee7cfbe4ad7
checksum_remote : a13aaeb99eb020a0bc8247685c274e7d
Run Code Online (Sandbox Code Playgroud)

“projectg715gb.pak”的大小为14.7Mb

但是,如果我尝试使用文本文件(大小为 1Kb):

print "checksum_local :",md5Checksum("toto.txt",None)
print "checksum_remote :",md5Checksum(None,"http://testpangya.ddns.net/toto.txt")
Run Code Online (Sandbox Code Playgroud)

然后它工作oO我得到这个输出:

checksum_local : f71dbe52628a3f83a77ab494817525c6
checksum_remote : f71dbe52628a3f83a77ab494817525c6
Run Code Online (Sandbox Code Playgroud)

我是比较 MD5 哈希的新手,所以请善待 ^^' 我可能犯了一些大错误,我不明白为什么它不能处理大文件,如果有人能给我一个提示,那就太好了!

不过感谢您的阅读和帮助!

fra*_*axa 6

所以感谢帮助者,这是最终的代码工作:

#-*- coding: utf-8 -*-

import hashlib
import requests

def md5Checksum(filePath,url):
    m = hashlib.md5()
    if url==None:
        with open(filePath, 'rb') as fh:
            m = hashlib.md5()
            while True:
                data = fh.read(8192)
                if not data:
                    break
                m.update(data)
            return m.hexdigest()
    else:
        r = requests.get(url)
        for data in r.iter_content(8192):
             m.update(data)
        return m.hexdigest()

print "checksum_local :",md5Checksum("projectg715gb.pak",None)
print "checksum_remote :",md5Checksum(None,"http://testpangya.ddns.net/projectg715gb.pak")
Run Code Online (Sandbox Code Playgroud)