【问题标题】:How are Hash Trees useful?哈希树有什么用?
【发布时间】:2012-11-12 09:59:35
【问题描述】:

我在 Wikipedia 上阅读了有关 hash trees 的信息,但我不明白这种结构的好处或目的 - 它们似乎需要更多的哈希,而不是每片叶子只有一个,而没有大量使用额外的哈希。

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

有人能解释一下哈希树如何以及为什么有用吗?

提前致谢,

莫舍

【问题讨论】:

    标签: data-structures hash


    【解决方案1】:
    1. 哈希树可以并行计算。如果您有两个数据块要散列,则可以使用两个处理器以两倍的速度计算散列。这仅在您的哈希速度低于 IO 速度时才有效,这不太可能。

    2. 哈希树可以从单个块的哈希计算,或者从正确对齐的较大部分的哈希计算。这很重要。

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

    为什么要使用树形哈希?

    当您想要计算文件的一部分和整个文件的哈希值时,树形哈希值是有利的。使用像 SHA-256 这样的常规哈希,您必须分别对文件块和整个文件进行哈希处理。如果文件为 8 GiB,这可能需要相当长的时间。使用树哈希,因为块的哈希用于计算文件的哈希,所以计算两个哈希都不需要额外的工作。

    树哈希有多少额外的工作?

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

    【讨论】:

    • You can verify the tree hash just by hashing each of the block hashes (which you already verified), which is a lot faster than rehashing the entire file. 那我们为什么不直接从我们拥有的所有块哈希中找到哈希,而不是构造一棵树呢?例如,如果 block1...blockN 的哈希是 h1...hn,那么我们为什么不直接做 hash(h1+h2+... +hn),而不是用不必要的中间内部散列(内部节点)构建树?你能解释一下使用树的必要性吗?
    • @GokulNC:这需要存储和传输所有中间哈希。使用树,您只需要存储/传输父节点哈希。您当然可以按照您描述的方式进行操作,但我看不出有什么好处。
    • 我想我没有用恰当的语言表达我的问题。我的意思是问,为什么我们要逐级计算哈希(在树中,使用中间级别)以获得父节点哈希,而我们可以通过在一个步骤中组合所有哈希(块/叶子)来做到这一点并计算组合的哈希?为什么是树?
    • @GokulNC:这正是我想你问的。仅使用一个中间级别意味着您必须存储/传输所有中间哈希以计算整个文件的哈希,即,您需要保持在 h1...hn 附近,直到您可以滚动它们向上。对于一个 1TB 的文件,您需要大约 32MB 的空间来验证哈希。这是很多额外的存储空间,但有什么好处呢?然后你被 1 MiB 的块大小困住了,你不能,例如像使用树哈希一样将其更改为 2 或 4。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2014-01-30
    • 2012-02-08
    • 2016-03-20
    • 2014-05-24
    • 2016-10-03
    • 2010-11-02
    • 1970-01-01
    相关资源
    最近更新 更多