比较生成的和谷歌云存储的难度提供了CRC32c校验和

Ste*_*gle 4 python crc32 google-cloud-storage gcloud-python google-cloud-python

我attemptting得到CRC32c我的本地文件的校验和,所以我可以把它比作blob.crc32c由gcloud库提供.谷歌说我应该使用crcmod模块来实际计算CRC32c我的数据的哈希值.

modifiedFile.txt 已从Google云端存储桶下载到我的本地文件系统.

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

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
Run Code Online (Sandbox Code Playgroud)

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

jte*_*ace 9

这是gsutil公共tarball的md5和crc32c示例:

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

我会在本地复制它以便:

$ 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    
Run Code Online (Sandbox Code Playgroud)

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

>>> import base64
>>> import struct
>>> struct.unpack('>I', base64.b64decode('vHI6Bw=='))
(3161602567,)
Run Code Online (Sandbox Code Playgroud)

要从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
Run Code Online (Sandbox Code Playgroud)

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

>>> base64.b64encode(crc32c.digest()).decode('utf-8')
'vHI6Bw=='
Run Code Online (Sandbox Code Playgroud)