3

ローカルファイルでCRC32cチェックサムを取得しようとしていますので、gcloudライブラリで提供されているblob.crc32cと比較できます。 Googleは、実際にCRC32cのデータを計算するために、crcmodモジュールを使用する必要があると言います。生成されたGoogleのクラウドストレージを比較するのが難しいです。CRC32cチェックサム

modifiedFile.txtは既にGoogle Cloud Storageバケットからローカルファイルシステムにダウンロードされています。

should_downloadは、modifiedFile.txtがローカルクライアントとリモートサーバーで異なるの場合にのみ、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 

残念ながら、それは現在、いつも私は実際に私が一致Blobオブジェクトに見ていた属性にcrcmodでビルドチェックサムを比較する方法がわからないと失敗します。リンクドキュメントから

答えて

4

ここでgsutilの公共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ライブラリから同じを取得するには:あなたがのgcloud/gsutilので使用されるのと同じBase64形式に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 

>>> base64.b64encode(crc32c.digest()) 
'vHI6Bw==' 
0

:「CRC32Cチェックサム、RFC 4960、付録Bで説明したように、エンコードされたビッグエンディアンバイト順にBASE64を使用して」

を使用すると、base64文字列をデコードしていないように見えます。

Windowsマシンの場合、バイナリモードでテキストファイルを開く必要があります。

関連する問題