入门者接触密码学词汇时,哈希是最容易张冠李戴的一个词:区块头哈希、默克尔树、由公钥推导地址,加上编程课本里的哈希表,好像都姓一个姓,是一家人。实情恰恰相反——哈希表与区块链共用同一种原语,回答的却是完全不同的问题:哈希表回答这条记录放在哪、怎么快点找到,服务的是一个程序;区块链回答这条记录谁写的、能不能事后赖账,服务的是互不信任的一群人。理解这条分界线,比背下两份定义有用得多。
哈希表是什么:一步走到正确的架子
哈希表的原型是图书架管理。把一摞书按到货顺序排开,找一本可能要翻遍全屋;图书管理员若先用一个固定公式把每本书的编号折算成走道号,书就放进对应走道的格子,下次再算一遍公式即可直达。程序里,书的编号叫键,固定公式叫哈希函数,走道格子叫桶,合起来就是哈希表:插入和查找通常只需要一次计算,记录变多也不用挨个翻。麻烦在于不同的键可能算出同一个桶——冲突。常见补救是在那个格子挂一条小链(链地址法),或者按规则往后找空位(开放寻址)。格子填得太密会变慢,所以哈希表还要定期扩容:开新格子、把所有键按新公式重新摊一遍。这种随时可搬、随时可改的设计,正是它与链式结构的分野:哈希表生来为了被修改,区块链生来为了抵抗修改。

区块链里的三处哈希各管什么
区块链同样大量使用哈希函数,但用在三个位置上。第一处是串联:每个区块头里都写有前一个区块头的哈希,形成一条指针链——改动任何一个旧块,它的哈希就变,链在其后的全部区块都要跟着作废重来,这是防篡改的第一道闸。第二处是汇总:区块里的交易两两成对折叠成默克尔树,树根写进区块头,代表这一批交易的整体指纹,轻客户端靠一条短路径就能核验某笔交易在不在块里。第三处是推导:地址由公钥经哈希再编码而来,单向性保证从地址反推不出公钥,更推不出私钥。三处用的都是哈希函数本身的性质:定长输出、难以求逆、输入改一个字输出面目全非(雪崩效应)——在这里哈希是指纹机,不是索引柜。
为什么哈希表替不了区块链
拆成四个问题就能看清。谁能写:哈希表住在某个人管理的机器里,管理员随时能改任何键值;区块链的写入规则要全网共同核对,改了旧账会被每个对家发现。改动成本:重写哈希表只是改内存里的几个字节;重写区块链要从那一块起重做全部工作,在工作量证明下等于持续烧真电。信任从哪来:哈希表的信任源是那个程序本身,坏了没有对账人;区块链的每个读者都是独立复核的审计员。解决的增长问题:哈希表解决找得快,区块链解决人人算得同一本账。一句话,前者是效率工具,后者是信任工具。
有趣的反转:两者其实在合作
全节点本地保存账本副本时,用的恰恰是高度类似哈希表的键值存储引擎(比特币核心与多数以太坊客户端的实现都建立在 LevelDB、RocksDB 这类存储系统之上):用键值映射快速定位交易、余额与状态。链式结构管写什么可信,本地索引管查得快,两层各司其职,根本不是对手。
快速问答
问:哈希函数和编程语言内置的 hash 函数是一个东西吗? 答:思想相同、目标不同。内置函数追求快和分布均匀,规则公开、不设防;密码学哈希追求单向性与抗碰撞,被专门设计成难以求逆,慢一点反而是特性。
问:那区块链查数据是不是很快? 答:恰恰相反,公开账本要求每个验证者重复计算和存储,天然昂贵;这正是节点需要本地索引层的原因。
问:改掉一个区块的哈希会怎样? 答:所有引用它的后继块全部对不上号,要让别人接受改动,就得从那一块起重演全部后续工作并跑得比诚实链更快。
常见误区
一是见哈希就联想成一回事,把索引结构与共识结构混为一谈;二是把链上不可篡改说成哈希函数的性质——它是串联结构、重做成本与全节点复核三者合谋的结果;三是用哈希表的随意删改去脑补链上账户,忘掉区块链的默认动作只有追加。
风险提示:本文为基础数据结构与密码学科普,不涉及任何资产价格或收益判断,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。