merkle tree
来源:互联网 发布:钟振振厉害吗 知乎 编辑:程序博客网 时间:2024/04/30 09:22
Merkle Tree的定义
Merkle tree,也可称作Merkle hash tree,是一种树形结构,所有节点存储的都是Hash值。它具有一下特点:
1、数据结构是一个树,可以是二叉树,也可以是多叉树(本BLOG以二叉树来分析)
2、叶子节点的value是数据集合的单元数据或者单元数据HASH。
3、非叶子节点value值可由所有的叶子节点的hash值按照一定 的算法计算而得出。
图1 Merkle Hash Tree
这里叶子节点存储的是数据块的Hash值,而其他的非叶子节点所存储的Hash值,都可以由叶节点的hash值计算出来。例如,用SHA1算法通过叶节点计算非叶节点的过程如下:
H11=SHA1(H23∥H24)
为什么用Merkle Tree
MerkleTree 大多用来进行数据的比对与验证处理。特别是在分布式的环境下,Merkle Tree可以大大减少数据的传输量,以及计算的复杂度。例如,对于图1来说,15,16,17......30是数据块的hash值,如果想把这些数据块从S传到D,且要保证D收到的数据的完整性或者说有效性(数据在传输过程中是否发生变化),则我们可以这样做:
1.S将所有数据块、数据块的Hash值及MerkleTree的root节点hash值传递给D(这里暂不考虑传输时对数据的加密处理);
2.D收到数据后构造出MerkleTree,然后比较与S的MerkeTree的root节点的Hash值是否一致。如果一致,表示数据是有效的;如果不一致,也可以在O(logn)时间内定位到哪个数据块发生了错误。
Merkle Tree的应用举例
1.BitTorrent中应用[1]
在BT中, 通常种子文件中包含的信息是Root值, 此外还有文件长度、数据块长等重要信息.。我们还以图1为例,当客户端下载数据块8时,在下载前,它将要求peer提供校验块8所需的全部路径哈希值:H24、H12、H6和H1。下载完成后, 客户端就会开始校验, 它先计算它已经下载的数据块8的Hash值23, 记做
2.Amazon Dynamo中同步数据[2]
Dynamo中使用Merkletree进行副本同步。其原理如下:
我们假设有A和B两台机器,A需要与B相同目录下有8个文件,文件分别是f1 f2 f3 ....f8。这个时候我们就可以通过Merkle Tree来进行快速比较。假设我们在文件创建的时候每个机器都构建了一个Merkle Tree。具体如下图:
图2 系统预先构建的MerkleTree
从上图可得知,叶子节点node7的value = hash(f1),是f1文件的HASH;而其父亲节点node3的value = hash(v7, v8)。就是这样表示一个层级运算关系。root节点的value其实是所有叶子节点的value的唯一特征。
假如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的节点需要每个子节点进行比较。过程描述图如下:
图3 文件f5出现不一致的比对过程
从上图可以得整个过程可以很快的找到对应的不相同的文件。
如果A机器的目录下增加了一个文件f9。整个merkle tree就会变成这样的:
图4 A中增加文件f9后的Merkle Tree
其中红色字体是需要进行运算的步骤,整个过程是从叶子节点发起的,直接回溯到root节点为止。
假如目录下的f1被删除。整树的运算变化图如下:
图5 删除f1后代MerkleTree
红色字体是需要进行的运算。
从上可以得知,merkle tree在大数据集合校验可以提高校验的效率的。从Dynamo论文中可以看出,大量使用merkle tree来同步分布式节点的文件和写操作,尤其是在服务节点异常后的情况,具体细节可以参看Dynamo论文中的描述。
3.Top-k Query[4] ——具体文章还没看
在Rui Zhang的这篇文章[5]中, 作者采用MerkleTree的目的也在于校验POI信息的真实性 这篇文章的阅读笔记在[6]. 基本思想是假设我们需要得到的query是POI(point-of-interest, 相当于评价 reviews),
,其中
指区域,
指按TOP排序的POI条数. 文中数据收集者将不同区域的POIs的数据的摘要当作MerkleTree的叶子节点来建立一个BinaryTree. 这些信息一并提供给LBSP(街旁 Foursquare Google Lattitude这样的location based service Provider)在QueryResult中附带这些信息, 这样用户就可以根据这些信息来验证这个Top-k query的可信度, 以防止LBSP依据自己的利益需求来修改排名.
参考:
1.http://www.360doc.com/content/13/0419/22/1073512_279573695.shtml
2.http://blog.csdn.net/syzcch/article/details/8054945
3.http://ultimatearchitecture.net/index.php/2010/09/12/merkle-tree/
4.http://www2.hawaii.edu/~ruizhang/paper/zhang-INFOCOM12-topk.pdf
- Merkle Tree
- Merkle Tree
- Merkle Tree
- merkle tree
- Merkle Tree
- Merkle Tree
- Merkle Tree
- Merkle Hash Tree
- Merkle Hash Tree
- Merkle Hash Tree
- Merkle Tree算法详解
- Merkle Tree 简介
- Merkle Tree及其应用
- Merkle Hashing Tree
- Merkle tree算法
- 白话 Merkle Tree
- Merkle Tree算法详解
- Merkle Tree(HashTree)
- leetcode链表相关题
- java在dos中打war包
- poi jar
- Oracle Text Literals (Q quote_delimiter )
- Android ListView组件中android:drawSelectorOnTop含义
- merkle tree
- Catalan数
- 走进C++程序世界----STL标准库
- 《程序员,你伤不起》读书笔记 (六) :IT软件创业之 -- 曾经热血沸腾软件创业、技术带人犯下的幼稚错误总结
- 在VC中读写ini配置文件
- 关于java协程和kilim的一些概念
- HDU 1237简单计算器
- TableView 使用时的一个异常
- 笔记本设置WIfi热点