6

我正在尝试获取CRC32c本地文件的校验和,以便将其与gcloud库提供的 blob.crc32c 进行比较。谷歌说我应该使用crcmod模块来实际计算CRC32c我的数据的哈希值。

modifiedFile.txt已经从 Google Cloud Storage 存储桶下载到我的本地文件系统。

这里的目标是只有在我的本地客户端和远程服务器上有不同should_download时才设置为 true。如果我的本地文件系统和我的 gcloud Blob 都具有相同的内容,如何让它们生成匹配?modifiedFile.txtCRC32cCRC32c

from crcmod import PredefinedCrc
from gcloud import storage

# blob is a gcloud Blob object

should_download = True

with open('modifiedFile.txt') as f:
  hasher = PredefinedCrc('crc-32c')
  hasher.update(f.read())
  crc32c = hasher.digest()
  print crc32c # \207\245.\240
  print blob.crc32c # CJKo0A==
  should_download = crc32c != blob.crc32c

不幸的是,它目前总是失败,因为我实际上不知道如何将我构建的校验和与我在匹配对象crcmod中看到的属性进行比较。Blob

4

2 回答 2

10

这是 gsutil 公共压缩包的 md5 和 crc32c 示例:

$ gsutil ls -L gs://pub/gsutil.tar.gz | grep Hash
    Hash (crc32c):      vHI6Bw==
    Hash (md5):     ph7W3cCoEgMQWvA45Z9y9Q==

我将在本地复制它以使用:

$ gsutil cp gs://pub/gsutil.tar.gz /tmp/
Copying gs://pub/gsutil.tar.gz...
Downloading file:///tmp/gsutil.tar.gz:                           2.59 MiB/2.59 MiB    

CRC 值通常显示为无符号 32 位整数。要转换它:

>>> import base64
>>> import struct
>>> struct.unpack('>I', base64.b64decode('vHI6Bw=='))
(3161602567,)

要从 crcmod 库中获取相同的内容:

>>> file_bytes = open('/tmp/gsutil.tar.gz', 'rb').read()
>>> import crcmod
>>> crc32c = crcmod.predefined.Crc('crc-32c')
>>> crc32c.update(file_bytes)
>>> crc32c.crcValue
3161602567L

如果要将值从 crcmod 转换为 gcloud/gsutil 使用的相同 base64 格式:

>>> base64.b64encode(crc32c.digest()).decode('utf-8')
'vHI6Bw=='
于 2016-05-23T15:41:41.500 回答
1

来自链接文档:“CRC32c 校验和,如 RFC 4960,附录 B 中所述;使用 base64 以大端字节顺序编码”

看起来您没有解码 base64 字符串。

如果您在 Windows 机器上,则需要以二进制模式打开文本文件。

于 2016-05-22T00:59:36.030 回答