【发布时间】:2016-01-19 04:12:35
【问题描述】:
Google 云存储使用 base64 编码值表示 md5hash 的对象。
如何将这些值转换为 md5sum 报告的十六进制版本?
【问题讨论】:
标签: python google-cloud-storage
Google 云存储使用 base64 编码值表示 md5hash 的对象。
如何将这些值转换为 md5sum 报告的十六进制版本?
【问题讨论】:
标签: python google-cloud-storage
您可以使用binascii.hexlify(或binascii.b2a_hex):
import base64
import binascii
print binascii.hexlify(base64.urlsafe_b64decode(md5_base64))
【讨论】:
这是一个使用 numpy 的简单 python 配方。
import numpy as np
b=np.frombuffer(base64.urlsafe_b64decode(md5_base64), dtype=np.uint8)
print "".join(["%0x"% l for l in b])
这里的 md5_base64 是谷歌云存储报告的值。您可以通过运行 ocmmand 来获取该值
gsutil stat gs://PATH/TO/FILE
输出应包括哈希 (md5)(假设它是 non composite object)。
【讨论】:
md5sum 来自 GCS 的兼容哈希列表对于寻找本地命令行/ coreutils 方式来检查您的云存储完整性的其他任何人 - 例如,您只是通过浏览器访问存储,或者您尝试验证的文件存储在其他地方,而您只是想要生成一个 .md5 哈希列表以便稍后运行 md5sum -c。
对于任何带有 gsutil ls -L 的 GCS 存储桶目录列表,通过此块(通过 alias 或 bash 脚本)管道输出
awk 'BEGIN { \
decodehash = "base64 -d | xxd -p | tr -d \"\\n\""; \
truncname = "sed \"s/gs:\/\/[a-z0-9_.\-]*\///\" | sed \"s/:$//\"" } \
/Hash \(md5\)/ { print $3 | decodehash; close(decodehash); \
printf " %s\n",fname | truncname; close(truncname) } \
/^gs:\/\// { fname = $0 }'
应生成与本地使用md5sum -c 的验证兼容的输出。基本上它是一个awk 块,它查找gs:// 行和Hash (md5): 行,交换它们的顺序(以便在文件名之前打印散列),并使用base64 -d 和xxd 将散列转换为十六进制字符串。
analogist@project-1111$ ls -L gs://bucket-name/directory
gs://bucket-name/directory/file1.tar.gz
Creation time: Wed, 10 Aug 2016 23:17:06 GMT
[...]
Hash (crc32c): a4X4cQ==
Hash (md5): 2xXYMp7aacmOZ+M57KHEbA==
[..]
gs://bucket-name/directory/file2.tar.gz
Creation time: Wed, 10 Aug 2016 23:26:16 GMT
[...]
Hash (crc32c): JVo9EA==
Hash (md5): XdrBIyCaADR9arH67ucdEA==
[..]
我可以将上面的awk代码块保存到文件md5convert,并且:
analogist@project-1111$ ls -L gs://bucket-name/directory | bash md5convert
db15d8329eda69c98e67e339eca1c46c directory/file1.tar.gz
5ddac123209a00347d6ab1faeee71d10 directory/file2.tar.gz
【讨论】: