我正在维基百科上阅读关于hash trees的内容,我不明白这种结构的好处或目的 - 它们似乎需要更多的哈希值,而不是每片叶子只有一个,而没有显着使用额外的哈希值。 / p>
例如,维基百科上的用例是它们用于验证P2P系统中接收的数据。但是为什么这比块数和它们的哈希的一对一映射更好,而没有树结构呢?
有人可以解释哈希树的用途和原因吗?
提前致谢,
摩西
答案 0 :(得分:11)
哈希树可以并行计算。如果您有两个要散列的数据块,则可以使用两个处理器以两倍的速度计算散列。这仅在您的哈希速度低于您的IO速度时才有效,这是不太可能的。
哈希树可以从单个块的哈希值计算,也可以从正确对齐的较大部分的哈希值计算得出。这很重要。
例如,如果我想向您发送一个文件,我可以将其分解为1 MiB的块,并使用SHA-256哈希向您发送每个块。如果任何单个块的哈希值不正确,那么您可以再次请求该块。最后,我可以为文件签名树形哈希并向您发送签名哈希。您可以通过散列每个块哈希值(已经验证过)来验证哈希值,这比重新整理整个文件要快得多。
只要您想要计算文件的一部分和整个文件的散列,树形散列就是有利的。使用像SHA-256这样的常规哈希,您必须分别对文件块和整个文件进行哈希处理。如果文件是8 GiB,这可能需要相当长的时间。使用树形哈希,因为块的哈希用于计算文件的哈希值,所以不需要额外的工作来计算两个哈希值。
计算树形哈希的“额外工作”实际上是最小的。是的,它确实需要计算额外的哈希 - 但只有O(1)额外的工作。如果您的块大小为1 MiB,那么如果您的文件为1 MiB或更小,则额外工作大约为零。随着数据大小的增加,额外工作量将接近每个数据块的两个哈希的1个额外哈希 - 对于SHA-256,核心将仅每1 MiB数据被评估两次额外的时间(一次用于输入哈希,一次用于填充)。那不是很多。