Google存储文本文件上的md5

问题描述

我对本地文件和远程文件进行了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