Merkle 树——空间换时间,分而治之的hash表,通过根节点是由它的两个子节点内容的哈希值组成来校验数据完整性,定位篡改的数据位置...
Merkle 树
图 1.5.6.1 - Merkle 树示例
默克尔树(又叫哈希树)是一种二叉树,由一个根节点、一组中间节点和一组叶节点组成。最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。
进一步的,默克尔树可以推广到多叉树的情形。
默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。
默克尔树的典型应用场景包括:
- 快速比较大量数据:当两个默克尔树根相同时,则意味着所代表的数据必然相同。
- 快速定位修改:例如上例中,如果 D1 中数据被修改,会影响到 N1,N4 和 Root。因此,沿着 Root --> N4 --> N1,可以快速定位到发生改变的 D1;
- 零知识证明:例如如何证明某个数据(D0……D3)中包括给定内容 D0,很简单,构造一个默克尔树,公布 N0,N1,N4,Root,D0 拥有者可以很容易检测 D0 存在,但不知道其它内容。
摘自:https://yeasy.gitbooks.io/blockchain_guide/content/crypto/merkle_trie.html
假如是 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))
Merkle Tree的优点
相对于 Hash List,Merkle Tree 的明显的一个好处是可以单独拿出一个分支来(作为一个小树)对部分数据进行校验,这个很多使用场合就带来了哈希列表所不能比拟的方便和高效。
Merkle Hash Tree 简介
上图(来自Wikipedia[1])给出了一个二进制的哈希树(二叉哈希树, 较常用的tiger hash tree也是这个形式). 据称哈希树经常应用在一些分布式系统或者分布式存储中的反熵机制(Anti-entropy),也有称做去熵的.这些应用包括 Amazon的Dynamo 还有Apache的Cassandra数据库, 通过去熵可以去做到各个不同节点的同步, 即保持各个节点的信息都是同步最新.
哈希树的特点很鲜明: 叶子节点存储的是数据文件,而非叶子节点存储的是其子节点的哈希值(称为MessageDigest) 这些非叶子节点的Hash被称作路径哈希值, 叶子节点的Hash值是真实数据的Hash值. 因为使用了树形结构, MT的时间复杂度为 O(logn)
比如下图中, 我们如果使用SHA1算法来做校验值, 比如数据块8对应的哈希值是H23
, 则按照这个路径来看 应该有
其中 ∥
是表联接的意思.
应用举例
Amazon Dynamo中同步[4]
在Dynamo中,每个节点保存一个范围内的key值,不同节点间存在有相互交迭的key值范围。在去熵操作中,考虑的仅仅是某两个节点间共有的 key值范围。MT的叶子节点即是这个共有的key值范围内每个key的hash,通过叶子节点的hash自底向上便可以构建出一颗MT。Dynamo首 先比对MT根处的hash,如果一致则表示两者完全一致,否则将其子节点交换并继续比较的过程, 知道定位到有差异的数据块. 这种同步方式在分布式中有着节省网络传输量的优点.
摘自:http://yishanhe.net/blog/merkle-hash-tree
转载于:https://www.cnblogs.com/bonelee/p/6409285.html
Merkle 树——空间换时间,分而治之的hash表,通过根节点是由它的两个子节点内容的哈希值组成来校验数据完整性,定位篡改的数据位置...相关推荐
- B树平衡过程-根节点为什么最少要有两个子节点?
一颗m阶的B树,这里阶的意思是指每个节点拥有的子节点个数,会满足以下几点: (1)每个节点最多有m个子节点(2)除了根节点和叶子节点之外,其它的每个节点最少有m/2(向上取整)个子节点(3)根节点至少 ...
- leetcode-383-Ransom Note(以空间换时间)
题目描述: Given an arbitrary ransom note string and another string containing letters from all the magaz ...
- 以空间换时间——动态规划算法及其应用:矩阵链相乘
动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...
- 空间换时间--编程小绝招解决电话区号识别算法问题
空间换时间问题通常都是一个不大的问题里的一个不小的解决方案.首先要理解代码中函数的一个大致的代价,在输入比较固定,计算输出又比较费劲的时候,常常就是空间换时间发挥作用的时候了.通过几个简单的例子您就会 ...
- 提高FLASH的擦写次数 “空间换时间”
提高FLASH的擦写次数 一.平时正常的读写,及损耗 二. "空间换时间" 三.数据结构 一.平时正常的读写,及损耗 Flash操作是往里面写0,按照平时的逻辑,每次参数发生了改变 ...
- FPGA之道(62)时空变换之空间换时间
文章目录 前言 时空变换之空间换时间 缓存提速使用 模块复制 同频模块复制 缓存降频复制 缓存降频使用 逻辑拆分 流水线 流水线的由来 如何在组合逻辑中使用流水线 如何在时序逻辑中使用流水线 顺序系统 ...
- 前端遍历导致查询数据时间过长_OLAP 服务器,空间换时间可行吗?
[摘要] 全量预汇总真的是提高 OLAP 性能的可行方案吗?点击了解OLAP 服务器,空间换时间可行吗? 多维分析提供拖拽.旋转.切片.钻取等等人机交互操作,必须有秒级的响应速度.而这些操作对应的明细 ...
- 空间换时间,查表法的经典例子
前言 上一篇分享了:C语言精华知识:表驱动法编程实践 这一篇再分享一个查表法经典的例子. 我们怎么衡量一个函数/代码块/算法的优劣呢?这需要从多个角度看待.本篇笔记我们先不考虑代码可读性.规范性.可移 ...
- [hashmap|空间换时间] leetcode 1 两数之和
[hashmap|空间换时间] leetcode 1 两数之和 1.题目 题目链接 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下 ...
最新文章
- Python 获取字符串的第一位和最后一位的字符
- DM达梦数据库 - 设置忽略关键字方法,login关键字处理实例演示
- xpath如何得到【爬虫】
- PHP 多维数组转json对象
- 想起温习一下JS中的this apply call arguments
- LeetCode 1913. 两个数对之间的最大乘积差
- 怎样解决Word文档图标无法正常显示的问题?
- android 拍照 图片剪切
- TempDB 中表变量和局部临时表的对比
- 全网最详细的HBase启动以后,HMaster进程启动了,几秒钟以后自动关闭问题的解决办法(图文详解)
- eclipse中新建JSP文件时的编码设置
- php薪资图表,加薪利器,老板再也不用担心生成图表图片了
- 第二章 过程域——技术解决方案
- 资料分析-增长率 比重 平均数 倍数等
- Python 制作迷宫游戏(一)——地图
- [KM 树同构Hash DP] BZOJ 3197 [Sdoi2013]assassin
- EXCEL的扩展名xls与xlsm有啥区别
- DL之DSSD:DSSD算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- 判断字符串是否存在于文件中
- 2021年春招总结 from:劳烦叫我小小泽
热门文章
- 怎么给el-select两级联动赋值_医保改革:支付范围、支付标准、支付方式的联动,大有可为...
- linux cpu %us,Linux top里面%CPU和us%的解释
- win10只有c盘怎么分区_磁盘分区:系统C盘空间不足怎么办?
- python判断日期_python如何判断日期的合法性?
- join left 大数据_Java并发编程笔记-JDK内置并行执行框架Fork/Join
- xheditor 内容保存时 不转义html特殊字符,xheditor编辑器上传图片(示例代码)
- android popupwindow dialog区别,Android PopUpWindow使用详解
- php内加百度熊掌号,百度熊掌号接入网站页面改造详细步骤
- Java后端简历模板,转疯了!
- 【一篇文章搞懂】Java社招最全面试题