问题描述
我对本地文件和远程文件进行了md5检查,看是否应该从Google存储设备中下载文件,我对本地文件执行以下操作:
def md5(self,file_name):
hash_md5 = hashlib.md5()
with open(file_name,"rb") as f:
for chunk in iter(lambda: f.read(4096),b""):
hash_md5.update(chunk)
return base64.b64encode(hash_md5.digest()).decode("utf8")
这对于zip文件可以正常工作,但是对于csv文件,哈希值与遥控器不匹配。
zip文件示例:
本地:cnNcwnBzQQ8py2cR5So7Sw ==
远程:cnNcwnBzQQ8py2cR5So7Sw ==
csv文件的示例:
本地:ICArEEpdMk1RdS6qDHyNww ==
远程:eKN + IclA + e9t + 5r7UFPFog ==
在远程文件上查看att内容编码,我发现它们是gzip格式的,因此尝试在散列之前对本地文件进行gzip压缩,但仍然没有匹配项。
示例文件的元数据:
Creation time: Wed,05 Aug 2020 02:40:40 GMT
Update time: Wed,05 Aug 2020 02:40:40 GMT
Storage class: STANDARD
content-encoding: gzip
Content-Length: 1479
Content-Type: text/csv; charset=utf-16le
Hash (crc32c): P6gUMw==
Hash (md5): X5HB70w6LAHrv/S6X45gtw==
ETag: COKRu+GEg+sCEAE=
Generation: 1596595240880354
Metageneration: 1
如果我在gzip之后进行校验和,则会得到: ZsAm2 / pMSDn5qWBzFuIFVg ==
与“ charset = utf-16le”有关系吗?
我无法将其用于csv文件,有什么想法吗?
解决方法
我转载了您的问题,zip
文件似乎不受影响,因为对象的内容已经被压缩,因此,哈希值是相同的。
另一方面,可以通过使用不同级别的压缩来压缩纯文本,这会使MD5发生变化,这是您在本地制作的gzip
与存储的Cloud之间看到不同MD5字符串的主要原因对象。
例如,这是我的云对象的大小和哈希值:
Size: 34713092
Hash: e7bc7678e973c466f15c74164ad45ad7
我用命令gzip -9
(最高压缩率)压缩下载的文件,然后得到了完全不同的对象
Size: 34694089
Hash: 88ced4e73a1b757ed264dc731649a18a