# -*- coding: utf-8 -*-
"""
Created on Tue Aug 29 14:42:07 2017
@author: Sean Chang
"""
import hashlib
#the node class of binary merkle hash tree
class MerkleNode(object):
def __init__(self,left=None,right=None,data=None):
self.left = left
self.right = right
#data stores the hash value
self.data = data
#build the tree recursively
def createTree(nodes):
list_len = len(nodes)
if list_len == 0:
return 0
else:
while list_len %2 != 0:
nodes.extend(nodes[-1:])
list_len = len(nodes)
secondary = []
#combine two nodes in pair
for k in [nodes[x:x+2] for x in range(0,list_len,2)]:
d1 = k[0].data.encode()
d2 = k[1].data.encode()
md5 = hashlib.md5()
md5.update(d1+d2)
newdata = md5.hexdigest()
#print("nodehash:",newdata)
node = MerkleNode(left=k[0],right=k[1],data=newdata)
secondary.append(node)
if len(secondary) == 1:
return secondary[0]
else:
return createTree(secondary)
#dfs traverse the whole tree with In-Order Traverse
def dfs(root):
if root != None:
print("data:",root.data)
dfs(root.left)
dfs(root.right)
#BFS the whole tree by using a queue
def bfs(root):
print('start bfs')
queue = []
queue.append(root)
while(len(queue)>0):
e = queue.pop(0)
print(e.data)
if e.left != None:
queue.append(e.left)
if e.right != None:
queue.append(e.right)
if __name__ == "__main__":
blocks = ['A','B','C','D','E']
nodes = []
print("leaf hash")
for e in blocks:
md5 = hashlib.md5()
md5.update(e.encode())
d=md5.hexdigest()
nodes.append(MerkleNode(data=d))
print(d)
root = createTree(nodes)
bfs(root)
Merkle Hash Binary Tree
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- Given inorder and postorder traversal of a tree, construc...
- 思路1 利用map存儲(chǔ)對(duì)應(yīng)的節(jié)點(diǎn), 算法2 先了解幾個(gè)特性1 二叉搜索樹(shù)左(右)子樹(shù)的值小于等于(大于等于)...
- Given a binary tree, find its maximum depth.The maximum d...
- 四月一日入職,到今天為止已經(jīng)整整入職一周,我不是全職坐班,只是一周去三次而已,加上公司團(tuán)建,一共去過(guò)五次公司,斷斷...