Data structures 哈希树如何有用?

Data structures 哈希树如何有用?,data-structures,hash,Data Structures,Hash,我在维基百科上读到过,但我不明白这种结构的好处或目的——它们似乎需要更多的散列,而不仅仅是每片叶子一个,而不需要大量使用额外的散列 例如,wikipedia上的用例是,它们用于验证P2P系统中接收到的数据。但为什么这比在没有树结构的情况下对块数及其散列进行一对一映射要好呢 有人能解释一下散列树是如何以及为什么有用的吗 提前感谢, 摩什 哈希树可以并行计算。如果要散列两个数据块,可以使用两个处理器以两倍的速度计算散列。这仅在哈希速度低于IO速度时有效,这是不可能的 散列树可以从单个块的散列计算,也

我在维基百科上读到过,但我不明白这种结构的好处或目的——它们似乎需要更多的散列,而不仅仅是每片叶子一个,而不需要大量使用额外的散列

例如,wikipedia上的用例是,它们用于验证P2P系统中接收到的数据。但为什么这比在没有树结构的情况下对块数及其散列进行一对一映射要好呢

有人能解释一下散列树是如何以及为什么有用的吗

提前感谢,

摩什

  • 哈希树可以并行计算。如果要散列两个数据块,可以使用两个处理器以两倍的速度计算散列。这仅在哈希速度低于IO速度时有效,这是不可能的

  • 散列树可以从单个块的散列计算,也可以从正确对齐的较大部分的散列计算。这很重要

  • 例如,如果我想向您发送一个文件,我可以将其分解为1个MiB的块,并将每个块及其SHA-256散列发送给您。如果任何单个块的哈希不正确,则可以再次请求该块。最后,我可以为文件的树散列签名,并将签名的散列发送给您。只需对每个块散列(您已经验证过)进行散列即可验证散列,这比重新对整个文件进行散列要快得多

    为什么要使用树哈希? 当您想要计算文件的一部分和整个文件的散列时,树散列是有利的。使用像SHA-256这样的常规散列,必须分别散列文件块和整个文件。如果文件是8gib,这可能需要相当长的时间。对于树散列,由于块的散列用于计算文件的散列,因此计算这两个散列不需要额外的工作

    一个树散列需要多少额外的工作?
    计算树散列的“额外工作”实际上是最小的。是的,它确实需要计算额外的哈希值——但只需要O(1)个额外的工作。如果块大小为1 MiB,则如果文件大小为1 MiB或更小,则额外工作量约为零。随着数据大小的增加,额外的工作量将接近每个数据块两个哈希的1个额外哈希——对于SHA-256,最多每1 MiB数据只对核心进行两次额外评估(一次用于输入哈希,一次用于填充)。这不算太多。

    只需对每个块散列(您已经验证过)进行散列,就可以验证树散列,这比重新对整个文件进行散列快得多。
    那么,我们为什么不从所有的块散列中集中找到散列,而不是构建一棵树呢??例如,如果block1…blockN的散列是h1…hn,那么我们为什么不直接进行散列(h1+h2+…+hn),而不是用不必要的中间内部散列(内部节点)构建一个树呢?你能解释一下使用树的必要性吗?@GokulNC:那需要存储和传输所有的中间哈希。对于树,您只需要存储/传输父节点散列。你当然可以按照你描述的方式来做,但我不知道这样做有什么好处。我想我没有用恰当的语言表达我的问题。我想问的是,为什么我们要逐级计算散列(在树中,使用中间级别)以获得父节点散列,而我们可以通过在单个步骤中组合所有散列(块/叶)并计算组合的散列来实现这一点?为什么是树?@GokulNC:我想你正是这么问的。仅使用一个中间级别意味着您必须存储/传输所有中间散列,以便计算整个文件的散列,也就是说,您需要保持h1…hn左右,直到您可以将其汇总。对于1TB的文件,验证散列需要大约32MB的空间。这是一个很大的额外存储空间,但有什么好处呢?然后,您将无法使用1 MiB块大小,例如,您不能像使用树散列那样将其更改为2或4。