区块链中的哈希算法

山水学院第三课

区块链中的哈希算法

您好,欢迎来到山水学院课堂,我是讲师山水先生。上一节课的最后,我们发现这张图的公钥和私钥太长了,跟我们申请IMtoken钱包时记下来的不一样。这节课我们来研究探讨这个问题。

仔细观察,我们身边总是充满了各种各样的编号。上学的时候,学校会给我们编一个学号;毕业后上班,公司会给我们编一个工号;家门前的门牌,桑拿房的手牌等等。这些编号或是数字,或者字母,或是数字加字母等,其目的只有一个,那就是方便管理。我们很难想象没有了编号,饭店如何把你点的菜送到你桌上,快递员如何把你的快递送到你家门前。站在管理者的角度来看,编号就是为了把一摊事管理得有井有条。

编号主要解决了两个问题,第一是定位,方便每一个人准确找到目标所在。第二是没有重号,保证目标位置的唯一性。

编号的方式也是有讲究的,管理者通常会考虑自己的管理体量进行针对性地编号。规模小的如班级编号,两位数字就可以解决问题了。稍大一些的管理如企业编号,会在数字前增加字母。而我们的身份证系统更是一个大规模的管理编号,使得我国13多亿的人口都拥有一个与众不同的身份证号码,方便了日常生活的有序进行。那如果是给互联网里的所有文件编号,标签应该如何贴呢?众所周知,互联网的是一个比特世界,这个世界的所有文件都由0和1组合而成。比如,我们眼中的香肠图片,在比特世界里是这样的:01010111001111010101100101110101……

我没写完整,写完得上万位,写完得一屋子,总之就是0和1两个数字排成了一条长龙,这才是这张图片在比特世界里的真实面目,我们把这串长龙称为“二进制文件”。那有没有效率更高的编号方法?有的,那就是哈希算法。

哈希算法是将文件映射为较短的固定长度字符串(哈希值)。我们把这条长龙切碎,搅拌之后就得到哈希值:4f7f56ecc0b725893b59f6428258304a94e40f48。哈希值是哈希算法的最终结果,是文件在互联网里的编号。如果这张图片是一个人,那哈希值就是TA的指纹、TA的身份证编号。

你完全不用理解哈希算法如何把二进制文件变成哈希值,这是数学家的事,你只要把哈希函数看作一台屠宰机器,就能理解一切:这台机器把任何猪都能剁成等长的香肠,而哈希值就是这根香肠的花纹。除了所有哈希值都一样长之外,这些花纹有一些其他漂亮的特性,能轻巧地用在比特世界的方方面面。而我们申请地址时的私钥和公钥,看到的也正是他们的哈希值。现在你明白不一样的原因了么?

如果你看到两个文件有完全相同的哈希值,那你立马可以判定它们是同一文件。这也是哈希值最基本的特性:相同文件的哈希值相同,即,复制后的文件与原文件哈希值相同。这容易理解,因为既然是两只一模一样的猪,那它们用相同方法做出来的香肠应该一模一样。但即使两只猪其他部位完全相同,哪怕它们尾巴尖上的一根毛不同,那香肠最终的纹理会完全不同。源文件稍有改动,哈希值都会面目全非。这一特性使得用哈希值标注的文件无法被篡改,因为哪怕只篡改上香肠图片的一个像素,马上就能被认出——因为哈希值会完全不同。

另外,哈希值还有一些特性:

第一、不可逆推:在具备编码功能的同时,哈希算法也作为一种加密算法存在。即你无法通过分析哈希值计算出源文件的样子,换句话说:你不可能通过观察香肠的纹理推测出猪原来的样子。

第二、计算极快:哈希一部20G高清电影和一个5K文本文件复杂度相同,计算量都极小,可以在0.1秒内得出结果。也就是说,不管猪有多肥,骨头多硬,做成香肠都只需要一眨眼的功夫。

能用极快的速度给你的文件编出不重复的号码,而且任何人都无法通过这个号码推算出文件原来的样子,这就是哈希算法的意义。

把文件切碎和搅拌的过程就是哈希算法,而切碎和搅拌的动作,称为加密和压缩,而不同的烧菜师傅会有不同的刀法,于是就有了很多哈希算法,比如:CRC-32、MD5和SHA256……名字虽然唬人,可它们之间只是张家师傅和李家师傅的区别,但不同师傅之间的刀功却有高下,那差距究竟在哪里呢?

正如前文维基百科的定义:哈希算法只是将文件映射为哈希值,“映射”的意思是投影。既然是投影,那总会不同的人有一模一样的影子。所以最终在数学意义上,哈希会发生重号,只是重号概率小到我们难以理解地接近零。这种无限接近零的概率类似于您每天都中六合彩。但万一碰到了,我们就把这种情况称为碰撞。越好的哈希算法发生碰撞的概率越小。

可如果只为完成“少发生碰撞”这一个目标,很容易实现,你只要把哈希值弄得长长的就可以了。但哈希值最终不是纯数字编号,而是数字与字母的组合,目的也只有一个:缩短哈希值长度,便于实际应用。毕竟,没有人会带一根1米的香肠出差。如果你要自建一个小型图片网站,使用CRC-32短哈希算法给图片贴标签就足够了,它能为你提供42亿种不同的标签,而且文件名长度(哈希值)永远只有8位。如果你要检索论文库,MD5算法足够你用:哈希值稍长,但几乎不会有重复,能让你做出足够精准的索引。

而商业级加密,你可以用SHA256:哈希值稍长,但倒推难度极大:需要人类当前所有计算能力总和的千万倍……还不一定能算出来。所以,无论是CRC-32、MD5、SHA256……并没有绝对最好的哈希算法。只有在不同场景下,衡量成本收益之后,才存在相对最优。

比特币的生态中,不仅仅只有私钥和公钥环节需要用到哈希算法,挖矿记账环节也是进行哈希运算的过程,可以说哈希算法在区块链技术中起着不可替代的作用,在这里由于时间的关系,就不一一展开了。

二十年前,如果你去图书馆找一本名叫《美国种族简史》的书,得先思考它属于宗教类还是历史类,然后再跑去不同的区域爬格子。而现在,你只需轻轻一点,整个屏幕就会告诉你有没有这本书,如果有,那它在哪里?图书馆贴标签以前是手工分类,现在是数据库。而互联网级别的大规模的搜索就得靠哈希算法生产索引标签了。比如Google等搜索引擎、迅雷等下载软件、比特币等加密货币……都能通过哈希值准确定位目标。

即使哈希算法乍看起来毫不起眼,无非做出了一串奇怪的字符,但它却是比特世界里的板砖,能搭出高楼大厦,能让比特世界更有序。即使离你再远的信息,在哈希算法的帮助下,都可以让你触手可及。

牛市看市,熊市看书。每周一课,山水学院将陪你度过这个漫漫寒冬。下一节课我们将探讨比特币是如何制造出机器信任,敬请期待!

- END -

长按以下二维码关注山水资本Club公众号

更多优质项目请关注公众号“山水资本Club”

或扫码添加以下客服进行了解

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180901G18LHS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券