6

gcloud ライブラリによって提供されるblob.crc32cCRC32cと比較できるように、ローカル ファイルのチェックサムを取得しようとしています。Google は、実際にデータのハッシュを計算するには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 public tarball の 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 に答える