如何计算md5校验和匹配gsutil算法

时间:2017-09-01 18:43:05

标签: python google-drive-api

使用Google的gsutil命令行工具,我可以通过运行生成文件的md5Checksum值:

gsutil hash -h c:/folder/filename.ext

生成的md5Checksum值如下所示:

abf688a738aedee31a1e5462e7a1a650

我想知道是否有办法使用Python的模块之一生成相同的md5Checksum值,例如checksum模块。

我试过用:

import hashlib
hashlib.md5(open(full_path, 'rb').read()).hexdigest()

但由此产生的&md5Checksum'值与gsutil hash -h full_path生成的值不同。

1 个答案:

答案 0 :(得分:2)

gsutil使用标准的MD5生成器。

它可以以两种模式之一运行 - 打印出MD5哈希的十六进制版本或base64版本。

该工具的说明:

NAME
  hash - Calculate file hashes


SYNOPSIS

  gsutil hash [-c] [-h] [-m] filename...



DESCRIPTION
  The hash command calculates hashes on a local file that can be used to compare
  with gsutil ls -L output. If a specific hash option is not provided, this
  command calculates all gsutil-supported hashes for the file.

  Note that gsutil automatically performs hash validation when uploading or
  downloading files, so this command is only needed if you want to write a
  script that separately checks the hash for some reason.

  If you calculate a CRC32c hash for the file without a precompiled crcmod
  installation, hashing will be very slow. See "gsutil help crcmod" for details.

OPTIONS
  -c          Calculate a CRC32c hash for the file.

  -h          Output hashes in hex format. By default, gsutil uses base64.

  -m          Calculate a MD5 hash for the file.

通过执行gsutil hash -h,您希望gsutil生成Python在您使用hexdigest()时生成的内容。

工作示例

让我们创建一个基线,这是我刚刚上传的随机图像。

Why not zoiderg?

如果您将其保存到系统中并运行gsutil hash -h,则应该看到以下内容:

gsutil hash -h ~/Downloads/TPQgK.png
Hashes [hex] for /Users/birryree/Downloads/TPQgK.png:
    Hash (crc32c):      CE24CAD6
    Hash (md5):     71c02116024d9fbd04663f4b9c0a082c

在Python中,您可以使用已有的哈希生成哈希值。

import hashlib
hashlib.md5(open('/Users/birryree/Downloads/TPQgK.png', 'rb').read()).hexdigest()
# output: 71c02116024d9fbd04663f4b9c0a082c

或者,如果您不使用-h标志,它将以Base64编码生成散列。

gsutil hash /Users/birryree/Downloads/TPQgK.png
Hashes [base64] for /Users/birryree/Downloads/TPQgK.png:
    Hash (crc32c):      ziTK1g==
    Hash (md5):     ccAhFgJNn70EZj9LnAoILA==

你可以像这样生成它

import hashlib
hashlib.md5(open('/Users/birryree/Downloads/TPQgK.png', 'rb').read()).digest().encode('base64').strip()
# Out[6]: 'ccAhFgJNn70EZj9LnAoILA=='