3

Я пытаюсь получить контрольную сумму CRC32c в своем локальном файле, чтобы сравнить ее с blob.crc32c, предоставленным библиотекой gcloud. Google говорит, что я должен использовать модуль crcmod, чтобы фактически вычислить CRC32c хэши моих данных.Сложность сравнения сгенерированных и облачных хранилищ Google предоставлена ​​CRC32c контрольных сумм

modifiedFile.txt был загружен из ведомого хранилища Google Cloud на мою локальную файловую систему.

Цель состоит в том, чтобы установить should_download в true, только если modifiedFile.txt имеет другой 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 

К сожалению, в настоящее время он всегда терпит неудачу, так как я на самом деле не знаю, как сравнить контрольную сумму я строй с crcmod атрибуту я вижу в совпадающем Blob объекта.

ответ

4

Вот пример md5 и crc32c для GSUtil общественного тарболла:

$ 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 в том же формате base64 используется gcloud/GSUtil:

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

Из связанной документации: «CRC32c контрольной суммы, как описано в RFC 4960, Приложение B, кодируется с использованием base64 в большой Endian порядка байт»

Похоже, что вы не декодирование строки base64.

Если вы находитесь на машине под Windows, вам нужно будет открыть текстовый файл в двоичном режиме.

 Смежные вопросы

  • Нет связанных вопросов^_^