3

Ich versuche, eine CRC32c Prüfsumme auf meiner lokalen Datei, so dass ich es mit der blob.crc32c von der gcloud-Bibliothek bereitgestellten vergleichen kann. Google sagt, dass ich das crcmod Modul verwenden sollte, um wirklich CRC32c Hashes meiner Daten zu berechnen.Schwierigkeit Vergleich generierten und Google Cloud-Speicher zur Verfügung gestellt CRC32c Prüfsummen

modifiedFile.txt wurde bereits von einem Google Cloud Storage-Bucket auf mein lokales Dateisystem heruntergeladen.

Das Ziel hier ist, should_download auf True zu setzen, nur wenn modifiedFile.txt eine andere CRC32c auf meinem lokalen Client vs meinem Remote-Server hat. Wie erhalte ich, dass sie übereinstimmende CRC32c erzeugen, wenn mein lokales Dateisystem und mein gcloud Blob den gleichen Inhalt haben?

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 

Leider scheitert es derzeit immer, da ich nicht wirklich wissen, wie die Prüfsumme mich mit crcmod das Attribute bauen vergleichen ich in dem passenden Blob Objekt sehe.

Antwort

4

Hier ist ein Beispiel md5 und crc32c für den gsutil öffentlichen Tarball:

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

ich es lokal kopiert werden, mit arbeiten:

$ 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-Werte in der Regel als unsigned 32-Bit angezeigt werden ganze Zahlen. So konvertiert es:

>>> import base64 
>>> import struct 
>>> struct.unpack('>I', base64.b64decode('vHI6Bw==')) 
(3161602567,) 

Um das gleiche von der crcmod Bibliothek zu erhalten:

>>> file_bytes = open('/tmp/gsutil.tar.gz', 'rb').read() 
>>> import crcmod 
>>> crc32c = crcmod.predefined.Crc('crc-32c') 
>>> crc32c.update(file_bytes) 
>>> crc32c.crcValue 
3161602567L 

Wenn Sie den Wert von crcmod auf das gleiche base64-Format konvertieren wollen, das von gcloud/gsutil:

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

aus der verknüpften Dokumentation: "CRC32c Prüfsumme, wie in RFC 4960, Anhang B beschrieben, codiert base64 in Big-Endian-Byte-Reihenfolge mit"

Es sieht aus wie Sie nicht entschlüsseln die Base64-String.

Wenn Sie sich auf einem Windows-Computer befinden, müssen Sie die Textdatei im Binärmodus öffnen.