我在 Python 中的实现计算了大约 1500 个输入哈希的 merkle 根哈希:
import numpy as np
from binascii import unhexlify, hexlify
from hashlib import sha256
txids = np.loadtxt("txids.txt", dtype=str)
def double_sha256(a, b):
inp = unhexlify(a)[::-1] + unhexlify(b)[::-1]
sha1 = sha256(inp).digest()
sha2 = sha256(sha1).digest()
return hexlify(sha2[::-1])
def calculate_merkle_root(inp_list):
if len(inp_list) == 1:
return inp_list[0]
out_list = []
for i in range(0, len(inp_list)-1, 2):
out_list.append(double_sha256(inp_list[i], inp_list[i+1]))
if len(inp_list) % 2 == 1:
out_list.append(double_sha256(inp_list[-1], inp_list[-1]))
return calculate_merkle_root(out_list)
for i in range(1000):
merkle_root_hash = calculate_merkle_root(txids)
print(merkle_root_hash)
由于 merkle 根计算了 1000 次,因此一次计算大约需要 5ms:
$ time python3 test.py
b'289792577c66cd75f5b1f961e50bd8ce6f36adfc4c087dc1584f573df49bd32e'
real 0m5.132s
user 0m5.501s
sys 0m0.133s
如何提高计算速度?这段代码可以优化吗?
到目前为止,我已经尝试在 Python 和 C++ 中展开递归函数。但是,性能并没有提高,大约花了 6 毫秒。
编辑
该文件可在此处获得: txids.txt
编辑 2
由于评论中的建议,我删除了unhexlify
和的不必要步骤hexlify
。在循环之前,列表准备一次。
def double_sha256(a, b):
inp = a + b
sha1 = sha256(inp).digest()
sha2 = sha256(sha1).digest()
return sha2
def map_func(t):
return unhexlify(t)[::-1]
txids = list(map(map_func, txids))
for i in range(1000):
merkle_root_hash = calculate_merkle_root(txids)
merkle_root_hash = hexlify(merkle_root_hash[::-1])
现在执行时间约为 4 毫秒:
$ time python3 test2.py
b'289792577c66cd75f5b1f961e50bd8ce6f36adfc4c087dc1584f573df49bd32e'
real 0m3.697s
user 0m4.069s
sys 0m0.128s