我正在尝试在本地文件上获取CRC32c
校验和,以便将其与gcloud库提供的blob.crc32c进行比较。 Google说我应该使用crcmod模块,以便实际计算我的数据的CRC32c
哈希。modifiedFile.txt
已经从Google Cloud Storage存储桶下载到了我的本地文件系统中。
这里的目标是仅在本地客户端与远程服务器上的should_download
具有不同的modifiedFile.txt
时,才将CRC32c
设置为true。如果我的本地文件系统和gcloud Blob的内容相同,如何让它们生成匹配的CRC32c
?
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
对象中看到的属性进行比较,因此当前总是失败。 最佳答案
这是gsutil公共(public)压缩包的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=='