首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >难以比较生成和google云存储提供的CRC32c校验和

难以比较生成和google云存储提供的CRC32c校验和
EN

Stack Overflow用户
提问于 2016-05-21 20:38:26
回答 3查看 2K关注 0票数 6

我试图在我的本地文件上获得一个CRC32c校验和,这样我就可以将它与gcloud库提供的blob.crc32c进行比较。谷歌说我应该使用crcmod模块来实际计算我的数据的CRC32c散列。

modifiedFile.txt已经从Google桶下载到我的本地文件系统上。

这里的目标是,只有当本地客户端上的should_download与我的远程服务器上的modifiedFile.txt有不同的CRC32c时,才能将modifiedFile.txt设置为真。在本地文件系统和gcloud Blob都有相同内容的情况下,如何让它们生成匹配的CRC32c

代码语言:javascript
运行
复制
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对象中看到的属性进行比较。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-23 15:41:41

下面是用于gsutil公共tarball的md5和crc32c示例:

代码语言:javascript
运行
复制
$ gsutil ls -L gs://pub/gsutil.tar.gz | grep Hash
    Hash (crc32c):      vHI6Bw==
    Hash (md5):     ph7W3cCoEgMQWvA45Z9y9Q==

我将在本地复制它,以便使用:

代码语言:javascript
运行
复制
$ 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位整数.为了改变它:

代码语言:javascript
运行
复制
>>> import base64
>>> import struct
>>> struct.unpack('>I', base64.b64decode('vHI6Bw=='))
(3161602567,)

要从crcmod库获得相同的信息,请执行以下操作:

代码语言:javascript
运行
复制
>>> 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格式:

代码语言:javascript
运行
复制
>>> base64.b64encode(crc32c.digest()).decode('utf-8')
'vHI6Bw=='
票数 11
EN

Stack Overflow用户

发布于 2016-05-22 00:59:36

来自链接文档:"CRC32c校验和,如RFC 4960所述,附录B;使用base64按大端字节顺序编码“。

看起来您没有解码base64字符串。

如果您在Windows机器上,则需要以二进制模式打开文本文件。

票数 1
EN

Stack Overflow用户

发布于 2022-11-06 00:51:03

2022年,我仍然很难找到一个明确的答案。下面是我想出来的,似乎适用于大型文件的内容。

代码语言:javascript
运行
复制
import google_crc32c
import collections

def generate_file_crc32c(path, blocksize=2**20):
    """
    Generate a base64 encoded crc32c checksum for a file to compare with google cloud storage.
    
    Returns a string like "4jvPnQ=="
    
    Compare with a google storage blob instance:
      blob.crc32c == generate_file_crc32c("path/to/local/file.txt")
    """
    crc = google_crc32c.Checksum()
    read_stream = open(path, "rb")
    collections.deque(crc.consume(read_stream, blocksize), maxlen=0)
    read_stream.close()
    return base64.b64encode(crc.digest()).decode("utf-8")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37367741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档