用Python对相同文件获取MD5,但MD5不同的解决办法

44 篇文章 0 订阅

前段时间写了一个Python脚本,目的是定时从目标位置获取文件,上传到阿里云OSS,为了避免重复上传相同的文件,我在每次获取到文件后加了一个获取其MD5的步骤,并用这个MD5在OSS中查找,如果有则放弃上传,没有则用这个MD5作为文件名进行上传。逻辑很简单,但不曾想没几天OSS就涨到将近1T,这就很迷惑了,因为目标文件总共就几百G。所以真相只有一个!MD5查重失效了!!!

看一下出错的代码:

import hashlib
import requests

class Archive:
	
	def __init__(self):
		self.hl = hashlib.md5()
	
	def get_file(self):
		file_getted = requests.get('xxxx', stream = True)
		self.hl.update(file.content)
		md5 = self.hl.hexdigest()
		return md5

这个Archive类只在定时脚本初始化的时候实例化了一次,之后就一直用的这个实例

所以问题就出在只实例化一次这里,之后的每次update都会在之前update的基础上再update

>>> import hashlib
>>> hl = hashlib.md5()
>>> hl.update("abc".encode("utf-8"))
>>> hl.hexdigest()
'900150983cd24fb0d6963f7d28e17f72'
>>> hl.update("def".encode("utf-8"))
>>> hl.hexdigest()
'e80b5017098950fc58aad83c8c14978e'

>>> hl = hashlib.md5()
>>> hl.update("abcdef".encode("utf-8"))
>>> hl.hexdigest()
'e80b5017098950fc58aad83c8c14978e'

所以可以看出

>>> hl = hashlib.md5()
>>> hl.update("abc".encode("utf-8"))
>>> hl.update("def".encode("utf-8"))

>>> hl = hashlib.md5()
>>> hl.update(("abc"+"def").encode("utf-8"))

相等
因此,想要每次update都是独立的,则必须要每次update前都实例化出新的hl
所以,上面的代码要改成

import hashlib
import requests

class Archive:
	
	def get_file(self):
		file_getted = requests.get('xxxx', stream = True)
		hl = hashlib.md5()
		hl.update(file.content)
		md5 = hl.hexdigest()
		return md5

但总感觉每次都进行实例化再update有点多余
所以,一般的做法是:

import hashlib
import requests

class Archive:
	
	def get_file(self):
		file_getted = requests.get('xxxx', stream = True)
		md5 = hashlib.md5(file.content).hexdigest()
		return md5

参考:https://stackoverflow.com/a/43697337

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值