Merkle Tree(HashTree)


    Merkle Tree是基于数据HASH构建的一个树,Merkle Tree的叶子节点的value是数据集合的单元数据或者单元数据hash,Merke Tree非叶子节点value是其所有子节点value的HASH值。
Merkle tree可以用来进行大数据的比对,可以快速定位(O(logn))到哪一部分数据不一致,在分布式环境下可以减少数据的传输量。
对比两个大数据的副本是否一样,可以这样来处理,首先比对两个大数据构造起来的Merkle Tree的root节点是否一致,一致则认为这两个副本是相同的。如果不同,可以比对其下的孩子的哈希值是否相同,不同的节点下的值肯定不同。所以顺着树往下找,就能找到到底是哪一部分的数据时不同的,可以快速定位不同的部分。

例子:

我们假设有A和B两台机器,A需要与B相同目录下有8个文件,文件分别是f1 f2 f3 ....f8。这个时候我们就可以通过Merkle Tree来进行快速比较。假设我们在文件创建的时候每个机器都构建了一个Merkle Tree。具体如下图:
假如A上的文件5与B上的不一样。我们怎么通过两个机器的merkle treee信息找到不相同的文件? 这个比较检索过程如下:

              
1、首先比较v0是否相同,如果不同,检索其孩子node1和node2.
2、v1 相同,v2不同。检索node2的孩子node5 node6;
3、v5不同,v6相同,检索比较node5的孩子node 11 和node 12
4、v11不同,v12相同。node 11为叶子节点,获取其目录信息。
5、检索比较完毕。
以上过程的理论复杂度是Log(N)。实际过程是大于这个复杂度的,因为不同value的节点需要每个子节点进行比较。过程描述图如下:

                  

从上图可以得知真个过程可以很快的找到对应的不相同的文件。如果A机器的目录下增加了一个文件f9。整个merkle tree就会变成这样的:

                 

其中红色字体是需要进行运算的步骤,整个过程是从叶子节点发起的,直接回溯到root节点为止。假如目录下的f1被删除。整树的运算变化图如下:

               

红色字体是需要进行的运算。从上可以得知,merkle tree在大数据集合校验可以提高校验的效率的。

为什么要使用Merkle Tree?
    目前, 在计算机领域,Merkle Tree大多用来进行比对以及验证处理。在处理比对或验证的应用场景中时,特别是在分布式环境下进行比对或验证时,Merkle Tree会大大减少数据的传输量以及计算的复杂度。例如,就拿图一举例,假如是 15,16.......30是一个个数据块的hash值,我把这些数据从A传输到B,数据传输到B后,我想验证下传输到B上的数据的有效性型(验证数据是否在传输过程中发生变化),只需要验证A 和 B上所构造的Merkle Tree的root节点值是否一致即可,如果一致,表示数据是有效的,传输过程中没有发生改变。假如在传输过程中,15对应的数据被人篡改,通过Merkle Tree很容易定位找到(因为此时,节点0,1,3,7,15对应的hash值都发生了变化),定位的时间复杂度为O(log(n)).

参考文献:
[1]. http://blog.csdn.net/yuanrxdu/article/details/22474697
[2]. http://www.360doc.com/content/13/0419/22/1073512_279573695.shtml
[3]. http://m.blog.csdn.net/blog/syzcch/8054945
[4]. https://en.wikipedia.org/wiki/Merkle_tree

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值