难以比较生成的和 google 云存储提供的 CRC32c 校验和
Difficulty comparing generated and google cloud storage provided CRC32c checksums
我正在尝试在我的本地文件上获取 CRC32c
校验和,以便我可以将它与 blob.crc32c provided by the gcloud library. Google says I should be using the crcmod 模块进行比较,以便实际计算我的数据的 CRC32c
哈希值。
modifiedFile.txt
已从 Google 云存储存储桶下载到我的本地文件系统。
此处的目标是仅当 modifiedFile.txt
在本地客户端与远程服务器上具有不同的 CRC32c
时才将 should_download
设置为真。如果我的本地文件系统和我的 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 # 75.0
print blob.crc32c # CJKo0A==
should_download = crc32c != blob.crc32c
不幸的是,它目前总是失败,因为我实际上不知道如何将我用 crcmod
构建的校验和与我在匹配的 Blob
对象中看到的属性进行比较。
来自链接文档:"CRC32c checksum, as described in RFC 4960, Appendix B; encoded using base64 in big-endian byte order"
您似乎没有对 base64 字符串进行解码。
如果您使用的是 Windows 机器,则需要以二进制模式打开文本文件。
这是 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=='
我正在尝试在我的本地文件上获取 CRC32c
校验和,以便我可以将它与 blob.crc32c provided by the gcloud library. Google says I should be using the crcmod 模块进行比较,以便实际计算我的数据的 CRC32c
哈希值。
modifiedFile.txt
已从 Google 云存储存储桶下载到我的本地文件系统。
此处的目标是仅当 modifiedFile.txt
在本地客户端与远程服务器上具有不同的 CRC32c
时才将 should_download
设置为真。如果我的本地文件系统和我的 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 # 75.0
print blob.crc32c # CJKo0A==
should_download = crc32c != blob.crc32c
不幸的是,它目前总是失败,因为我实际上不知道如何将我用 crcmod
构建的校验和与我在匹配的 Blob
对象中看到的属性进行比较。
来自链接文档:"CRC32c checksum, as described in RFC 4960, Appendix B; encoded using base64 in big-endian byte order"
您似乎没有对 base64 字符串进行解码。
如果您使用的是 Windows 机器,则需要以二进制模式打开文本文件。
这是 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=='