【问题标题】:Reverse tree building (with an odd number of children)反向树构建(具有奇数个孩子)
【发布时间】: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 个块实例)。

现在我有两个相互关联的大问题:

  1. 如何反向构建这棵树?我基本上需要为最低层上的每两个块实例创建一个新块,并根据这两个散列计算一个散列。但是我在哪里存储那个父母?在父母的孩子和做反向树行走?
  2. 如何处理奇数个孩子?如果我有一个遍历每个父层的算法,那么我会错过最后一个 (0.5 MB) 块。

我在 SO 上查看了 this topic,但该方法仅适用于偶数子数,这并不总是给出。

你能帮我找到解决这个问题的方法/算法/方法吗?

提前致谢!

保罗

【问题讨论】:

  • 你如何决定哪个是父母,哪个是孩子?
  • 您是否已经尝试使用 hashlib 正常散列存档?
  • @GodMan 你到底是什么意思?底层是孩子,从 2 个块构建的哈希是这 2 个块的父级,依此类推。
  • @pythonm 是的,但这只是所需标头的 1/2。我还需要这个 SHA-256 树才能成功上传文件。有关x-amz-content-sha256x-amz-sha256-tree-hash,请参阅here
  • 那么,我的问题是你是否已经建好了树?或者您只有哈希值并且您需要帮助使用这些哈希值构建树?

标签: python algorithm hash amazon-web-services hashtree


【解决方案1】:

先计算层数,然后

def proclevel(levels):
    if levels > 0:
        generator = proclevel(levels - 1)
        temp = None
        for firsthash, secondhash in generator:
            if not temp: temp = hashofthem(firsthash, secondhash)
            else: yield temp, hashofthem(firsthash, secondhash); temp = None
        #If odd number of packets
        if temp: yield temp, None
    else:
        temp = None
        for chunk in chunks:
            if not temp: temp = hash(chunk)
            else: yield temp, hash(chunk); temp = None
        if temp: yield temp, None

确保将 None 作为 hashofthem 中的第二个参数处理 :)

【讨论】:

  • 啊,递归,当然是 facepalm。我将尝试一下,并希望 - 报告成功。 ;)
  • 这个二叉树请求递归 ;)
  • 它似乎奏效了!非常感谢! 你应该暗示第二个参数可能是 None 真的,真的很大胆 - 我花了一段时间才弄清楚出了什么问题;)
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 2022-08-11
  • 2013-04-04
  • 2020-04-21
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多