Merkle Patricia Tree 梅克尔帕特里夏树(MPT)规范(笔记)

Merkle Patricia Tree1,梅克尔帕特里夏树,提供了一个基于加密学的,自校验防篡改的数据结构,用来存储键值对关系。后文中将简称为MPT。尽管在本规范范围内,我们限定键值的类型只能是字符串(但仍对所有的类型适用,因为只需提供一个简单的序列化和反序化机制,将要存储的类型与字符串进行转换即可)。

MPT是确定的。确定性是指同样内容的键值,将被保证找到同样的结果,有同样的根哈希。关于效率方面,对树的插入,查找,删除的时间复杂度控制在O(log(n))。相较于红黑树来说,MPT更好理解和编码实现。
1. 前言:基数树(Radix Tree)
在一个标准的基数树里,要存储的数据,按下述所述:

[i0, i1, … iN, value]

其中的i0到iN的表示一般是二进制或十六进制的格式的字母符号。value表示的是树节点中存储的最终值。每一个i0到iN槽位的值,要么是NULL,要么是指向另一个节点的指针(在当前这个场景中,存储的是其它节点的哈希值)。这样我们就实现了一个简单的键值对存储。举个例子来说,如果你想在这个基数树中,找到键dog所对应的值。首先需要将dog转换为比如ascii码值(十六进制表示是646f67)。然后按字母序形成一个逐层向下的树。沿着字母组成的路径,在树的底部叶节点上,即找到dog对应的值。具体来说,首先找到存储这个键值对数据的根节点,找到下一层的第6个节点,然后再往下一层,找到节点4,然后一层一层往下找,直到完成了路径 root -> 6 -> 4 -> 6 -> f -> 6 -> 7。这样你将最终找到值的对应节点。

基数树的更新和删除操作比较简单,可以按下面的定义:

def update(node,key,value):
if key == ”:
curnode = db.get(node) if node else [ NULL ] * 17
newnode = curnode.copy()
newnode[-1] = value
else:
curnode = db.get(node) if node else [ NULL ] * 17
newnode = curnode.copy()
newindex = update(curnode[key[0]],key[1:],value)
newnode[key[0]] = newindex
db.put(hash(newnode),newnode)
return hash(newnode)

def delete(node,key):
if key == ” or node is NULL:
return NULL
else:
curnode =

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值