java merkle树,使用Merkle树检测数据不一致(翻译)

article/2025/10/4 19:10:00

背景

Cassandra的逆熵功能使用Merkle树来检测副本之间的数据不一致。

定义

Merkle树是一种哈希树,其中的叶子包含各个数据块的哈希值,父节点包含其各自的子节点的哈希值。它提供了一种有效的方法来查找副本上存储的数据块中的差异,并减少了传输以比较数据块的数据量。

Cassandra的Merkle树(org.apache.cassandra.utils.MerkleTree)的实现使用完美的二叉树,其中每个叶子都包含行值的哈希,每个父节点都包含其左右子节点的哈希。在一棵完美的二叉树中,所有叶子都处于同一水平或相同深度。深度为h的完美二叉树包含2 ^ h树叶。换句话说,如果范围包含n个标记,则表示该范围的Merkle树包含log(n)级别。

执行nodetool repair命令时,在命令中用-h选项指定的目标节点会协调每个键空间中每个列系列的修复。修复协调器节点从每个副本请求Merkle树以获取特定的令牌范围,以对其进行比较。每个副本通过扫描在请求的令牌范围内本地存储的数据来构建Merkle树。修复协调器节点比较Merkle树,找到所有副本之间不同的子令牌范围,并修复这些范围内的数据。

复制节点为每个列族构建一个Merkle树,以表示给定令牌范围内的行的哈希。使用RandomPartitioner时,令牌范围最多可以包含2 ^ 127个令牌。需要深度为127的Merkle树,其中包含2 ^ 127个叶子。Cassandra构建了深度为15的Merkle树的紧凑版本,以减少用于存储树的内存使用量,并最小化将Merkle树传输到另一个节点所需的数据量。它将扩展树,直到将给定的令牌范围划分为32768个子范围。在树的紧凑版本中,每个叶子表示其各自子范围中所有行的哈希。无论其大小和拆分程度如何,如果两棵Merkle树具有相同的哈希深度,就可以对其进行比较。

例如,令牌范围(0,256]包含256个子范围(0,1],(1,2] ...(255,256],每个包含单个令牌。深度为8的完美二叉树需要在叶子上存储所有256个子范围散列。深度为3的同一版本的树的紧凑版本仅包含8个代表子范围(0,32],(32,64] ...(224,256]子集散列的叶子包含32个令牌。在此紧凑型树中,每个叶哈希是深度为8的理想二叉树中其下所有节点的计算哈希。

509bf8534bd94c1f75f7701b4c943e97.png

构建Merkle树(递归)

RandomPartitioner均匀地分配key,因此通过将给定标记范围分成两个相等的子范围,直到达到最大子范围数,从而递归构造Merkle树。将根节点添加给定的令牌范围(左,右),并在令牌的范围内将其分为两半,令牌位于范围的中点。左侧的子节点添加范围(左,中点)和在右边的子节点上添加范围覆盖(中点,右边),重复此过程,直到将所需数量的叶子(子范围)添加到树上为止。

将下一行哈希按排序顺序添加到Merkle树中。通过计算行值的MD5摘要来计算每行的哈希值,该值包括行的列数,列名和列值,但不包括行键和行大小。删除的行(逻辑删除)哈希也会添加到树中,其中包括删除时间戳。行哈希基于其令牌添加到Merkle树叶。如果叶子的子范围包含多行,则使用XOR操作通过组合其范围所覆盖的所有行的哈希来计算其哈希。非叶节点哈希值是通过对各自子节点的哈希值执行XOR计算得出的。

比较默Merkle树(递归)

如果两棵Merkle树都覆盖相同的令牌范围,则无论它们的大小如何,都将对其进行比较。从根哈希开始递归比较树。如果两个树中的根哈希都匹配,则树的令牌范围中的所有数据块在副本之间都是一致的。如果根哈希不一致,则比较左子哈希,然后再比较右子哈希。进行比较,直到计算出两棵树之间的所有令牌范围都不同为止。

Q&A

Q:如何保证节点保存的token范围都是一致的??

A:因为Cassandra的复制节点是顺时针进行制定的,复制的数量由复制因子决定,而比较就发生这些节点之间

小结

Merkle树不仅可以快速比较 多个文件是否完全相同,而且如果不同可以快速定位到不相同的文件

参考

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[使用Merkle树检测数据不一致(翻译)]http://www.zyiz.net/tech/detail-99474.html


http://chatgpt.dhexx.cn/article/lWkATAEI.shtml

相关文章

区块链 — 默克尔树

文章目录 默克尔树生成过程应用场景在区块链中的应用 默克尔树 默克尔树(又叫哈希树)是一种典型的二叉树结构,有一个根节点、一组中间节点和一组叶节点组成。默克尔树最早由 Merkle Ralf 在 1980 年提出,曾广泛用于文件系统和P2P…

哈希算法的原理以及代码实现

哈希函数: 简单来说就是把红框内的数字根据 一定规律 存放到下方白色的数组中 (称为哈希表) 这里它的一定规律是 取余法 H(key)key%p (还有其他方法,这里采用的是取余法),p为这个…

二、哈希算法和Merkle Tree

章节系列目录:点击跳转 文章目录 哈希算法哈希函数的定义可靠哈希函数需满足的要求哈希函数的主要作用哈希实际例子 Merkle Tree默克尔树完整性校验的方法哈希列表 Hash ListMerkle Tree 哈希树总结 哈希算法 哈希函数的定义 哈希函数:给一个任意大小的…

Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树

上一篇说AVB内存装不下的较大分区(如文件系统)可能会使用哈希树,还提到了dm-verity。这篇来看看这两个是啥? dm-verity 1、dm-verity 1、能不能将多个硬盘,映射成一个逻辑的硬盘,那样我们程序就不用关心复…

哈希表与树的介绍

前言 该篇文章,主要带我们认识什么哈希表和树,为我们在研究各个数据结构的实现及扩展算法,有个基本的认识。 哈希表 特点 数组 :寻址容易 ;数据连续存储空间链表:插入与删除容易 ;放在堆内…

简单哈希树

哈希树 在各种介绍里的都比较抽象,其实没有那么难,这里进行一个最简单的说明。 在将一个数进行哈希的时候,我曾经写过关于哈希的这么些东西:对于数,当一个质数不够用的时候,可以加上第二个质数,…

查找——图文翔解HashTree(哈希树)

引 在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。 之前我们介绍的各种…

图文详解哈希树-Merkle Tree(默克尔树)算法解析

2019独角兽企业重金招聘Python工程师标准>>> Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。[1] 1、Hash Hash是…

图文详解HashTree(哈希树)

引 在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。 之前我们介绍的各…

哈希树HashTree(trie树)

引 在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。 之前我们介绍的各种…

哈希(Hash)和哈希树(Merkle tree)

哈希函数(英语:Hash function)又称散列函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合&#xff0c…

哈希树总结-java版

目录 哈希树的理论基础 质数分辨定律 余数分辨定理 哈希树简介 查找 删除 优点 缺点 哈希树的java实现 节点 哈希树 哈希树的应用 哈希树的理论基础 质数分辨定律 这个定理可以简单的表述为:n个不同的质数可以“分辨”的连续整数的个数和他们的乘积相等…

哈希树的python实现

一、问题的背景 给定一组商品购买信息,找到商品购买中频繁出现的商品集。比如说,我们有如下的商品交易信息: 市场购物信息 TipItems1Bread, Milk2Bread, Diaper, Beer, Egg3Milk, Diaper, Beer, Coke4Bread, Milk, Diaper, Beer5Bread, Milk,…

哈希列表、哈希链、哈希树

通过哈希算法检验大量数据(比如大量文件)的一致性时,常见的存储方案: 哈希列表(Hash List) 原理: 计算每个数据的哈希值,保存为一个列表。记录该列表的哈希值,用于检验…

哈希树

哈希树: 哈希树(HashTree)算法就是要提供一种在理论上和实际应用中均能有效地处理冲突的方法。一般的哈希(Hash)算法都是O(1)的,而且基本是以空间换时间。这很容易导致对存储空间无限制的需求。本文中哈希树(HashTree)算法在实际操作中使用了一些技巧使…

哈希树 (HashTree)

在讲hash树之前首先我们来理解一下质数分辨定理。 什么是质数分辨定理? 什么是质数 : 即只能被 1 和 本身 整除的数。 为什么用质数:因为N个不同的质数可以 ”辨别“ 的连续整数的数量,与这些质数的乘积相同。 百度文库解答&#…

Merkle树介绍

默克尔树(Merkle树)又叫哈希树,是区块链数据存储运用到的一个重要的技术算法。 简单来说,哈希树(默克尔树)中,每个节点都标有一个数据块的加密哈希值。哈希树可以用来验证任何一种在计算机中和计…

Merkle Tree(默克尔树)算法解析

Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。[1] 1、Hash Hash是一个把任意长…

js中的var是什么意思

js中的var是定义变量的意思,使用和不使用var都能定义变量,但是两个变量的作用域不同。 (1)在函数中和函数外分别用var定义一个变量a,函数外的变量a是全局变量,函数内的变量a是局部变量,所以在函…

python中的var是什么什么的缩写_var是什么意思

展开全部 VAR是英文Video Assistant Referee的缩写,也被称作“视频助理裁判”,由现役裁判员担任,他的职责是通过回放视频向裁e5a48de588b63231313335323631343130323136353331333366303733判员提供信息,协助裁判员纠正改变比赛走…