这一节讲解 Hash的另外一个大的用处,构造一些神奇的数据结构以增加不可篡改(tamper)性。总体来说有两类,分别是链表和二叉搜索树的变种,也称之为:
- block chain
- Merkle Tree
block Chain
他其实就是一个链表,不过,每一项都保存了前一项的消息摘要,hash值
这里面的一个重要的东西是: Hash Pointer,官方的介绍是这样的:
就是包含两个信息:
- 所指向节点的位置
- 所指向节点的hash值
remark 这里需要解释的是,实现中只要能实现这个功能
就行了,并不是说这个hash值既表示前一个的摘要信息,又表示前一个的物理位置
用途
最大的好处就是防止篡改。我们举一个 tamper-evident log 的例子
比如说我们更改了第 (记从左到右分别编号 )块的data,那么检测第 肯定能检测出来,因此敌手势必要将所有块的hash 都更改,最终更改到head hash pointer 上,因此只要我们留有最终的hash pointer,那么就能检测到所有的篡改。
Merkle Tree
叶子结点存放的是data,中间节点都是各自的 hash pointer.修改任何一个节点都能被发现。
特点
- Time: O( )
- Space: O( )
用途
成员证明(proof of membership)
其实也是空间换时间,我们只需记录一条从data到root的路径,那么就能在不超过
的时间证明。而不用搜索整个 区块链
总结
我们总是可以将 hash pointer
放在没有环的数据结构中,防篡改。但是有环就不行了。