【发布时间】:2012-08-16 23:37:44
【问题描述】:
我刚刚发现了 AWS Glacier 服务,并想编写一个 small Python 应用程序来通过 REST API 上传文件。我查看了所需的标题并偶然发现了x-amz-sha256-tree-hash。我需要计算整个文件的 SHA-256 哈希值以及每个 1 MB 块的所有哈希值的父级哈希值。这导致以下树:
(图片取自here)
我已经创建了一个读取 1 MB 块的函数和一个即时计算其哈希值的类,但后来我完全陷入了困境:
在我的应用程序中,我创建了一个名为chunk 的类,它获取数据并在__init__ 方法中计算哈希值,并保存父子节点(就像一棵普通的树)。
当用户打开一个文件时,这些块实例将使用它们各自的哈希正确生成(在本例中为 7 个块实例)。
现在我有两个相互关联的大问题:
- 如何反向构建这棵树?我基本上需要为最低层上的每两个块实例创建一个新块,并根据这两个散列计算一个散列。但是我在哪里存储那个父母?在父母的孩子和做反向树行走?
- 如何处理奇数个孩子?如果我有一个遍历每个父层的算法,那么我会错过最后一个 (0.5 MB) 块。
我在 SO 上查看了 this topic,但该方法仅适用于偶数子数,这并不总是给出。
你能帮我找到解决这个问题的方法/算法/方法吗?
提前致谢!
保罗
【问题讨论】:
-
你如何决定哪个是父母,哪个是孩子?
-
您是否已经尝试使用 hashlib 正常散列存档?
-
@GodMan 你到底是什么意思?底层是孩子,从 2 个块构建的哈希是这 2 个块的父级,依此类推。
-
@pythonm 是的,但这只是所需标头的 1/2。我还需要这个 SHA-256 树才能成功上传文件。有关
x-amz-content-sha256和x-amz-sha256-tree-hash,请参阅here。 -
那么,我的问题是你是否已经建好了树?或者您只有哈希值并且您需要帮助使用这些哈希值构建树?
标签: python algorithm hash amazon-web-services hashtree