比特币的密码学基础:哈希

昨天我们讲了比特币的网络基础,即比特币的组网是P2P结构的,但我们并没有深入地讲P2P是如何实现的,因为P2P已经是一个很成熟的技术,比特币之于P2P,就像一个苹果放在桌子上,我们要研究这个苹果,无需搞懂这个桌子是怎么做出来的。当然,有兴趣的同学可以专门去了解P2P技术。

接下来这两篇,我们聊聊比特币的密码学基础。提到密码学,大家肯定觉得特别高大上,头大。放心,不死姐在介绍区块链的时候,会跟昨天讲网络结构一样,把握一个原则——最小知识集原则,即只选择那些为了弄懂区块链而不得不学的知识。所以,这两篇我们不会系统介绍密码学,只学习两个不得不学的密码学概念。然后,这两篇之后,我们就开始正式学习区块链的基本原理。

废话不多说了,这一篇的目的就是让大家搞懂一个概念:哈希。

哈希这个词,想必大家都见过,而且也感觉似懂非懂。它还有另外一个名字,叫“散列”,哈希其实是“hash”的音译。所以,以后大家见到哈希和散列这两个词,就知道说的是同一个家伙。另外在区块链里,我们经常聊算力,算力的单位是H/s,这个H其实就是哈希,10H/s就是1秒能做10次哈希。当然H/s前面经常还会加K、M、G这些字母。这些字母其实是表数量级的,像我们平常表示带宽一样,KH/s就是1千哈希每秒,MH/s就是百万哈希每秒等等。相信看完本文,学习完哈希之后,你会非常清楚地知道算力到底是个什么鬼。

我们知道,计算机和互联网不管多么神通广大,但它们其实只认识0和1两个数字,不管是多么长多么复杂的文字、图片、视频,在计算机里存储的,在互联网上传输的,永远都是一串由0和1组成的数据。不同长度、不同组合的0和1可以表达世界上任何信息,就像26个英文字母可以组合出可表达任何意思的单词一样。现在我建一个txt文件,在里面写上“I love you”,然后保存。但其实计算机里存储的是这么一大串:010010010010000001101100011011110111011000100000011110010110111101110101

好,我们现在知道了任何信息都可以翻译成一串0和1。那哈希是什么呢?其实,哈希就是一种运算,就像加减乘除一样,只不过哈希的运算是将任意长度的0和1,变成固定长度的0和1。所以,任何信息,不管多长,经过哈希运算后,都将输出固定长度的数据。当然,哈希算法不同,固定长度也不同,比如最简单的哈希算法“SHA1”,算出的结果是160位,也就是由160个0或1组成;比特币挖矿用到的是“SHA256”,算出的结果是256位。至于具体怎么算的,我们继续秉承最小知识集原则,不去管它。我们只要知道,哈希就是个黑箱子,不管进去的是姚明还是潘长江,抑或是一只蚂蚁,出来的都是HelloKitty!

我们在上面找一句话哈希一下试试:

嗯,就是这效果。你肯定要问,这么一个运算有什么用啊?用处大着呢,区块链技术里多处用到它,以后咱们会见着。现在,我们边聊它的特征,边聊它的应用:

1、 对所有信息都能进行处理

不留死角,使用范围无限制。

2、 不可逆

运算不可逆,原始数据可以哈希出结果,但从结果无法得出原始数据。我们想想就知道,输出结果是固定长度的,比如128位,假如这128位是一篇几万字的文章哈希得来的,我们怎么可能从这128位算出一篇文章来?

所以,如果给你一个哈希值,然后要你找出它对应的原始值,那只有一个最野蛮的办法,那就是不停地找各种数据充当输入进行哈希,纯靠运气去试,哈希出来的结果与给定的结果一致,才算OK。比特币的挖矿就利用了哈希的这个特征,比特币系统给出一个满足特定条件的哈希值(比如说这个哈希值的前面多少位必须是0),然后让矿工去寻找对应的原始值。矿工们没办法,只能用最原始的办法不断尝试,谁先试出来谁就拿到比特币。矿工们为了竞争,于是不断加大芯片计算哈希的能力,进行军备竞赛。而这个计算哈希的能力便是算力,谁在1秒内能做更多的哈希运算,谁的算力就更大。

3、 差之毫厘,谬以千里

我们看下面这个哈希,原始数据跟上图比,只是少了最后的句号,但哈希出来的结果完全变了样。

这个特征可以实现一个叫指纹或摘要的功能。比如说,我原创了一篇文章,打算存在区块链上留做证据,但如果原文不动存上去,太耗费资源了,但我可以把这篇文章先哈希一下,得到一个很短的哈希值,然后把这个哈希值存到区块链上就行了。因为别人要证明的话,只要拿我的文章哈希一下,再拿结果与区块链上存储的哈希值对比一下就知道是不是了。所以,哈希可以验证信息的完整性和真实性。

4、 原始值与哈希值不是一一对应关系

因为原始值是不固定长度,而哈希值是固定长度,那肯定不是一一对应的。但如果不是一一对应,那就说明不同的原始值可能哈希出相同的哈希值,也就是“哈希碰撞”。那如果用这个方式来做证明,岂不是很不靠谱。

非也。

成年人考虑问题要看概率。拿最简单的SHA1来说,哈希结果是160位,这就意味着总的哈希值数量有2的160次方,也就说,两个原始值的哈希值一致的概率是2的160次方。你可能对2的160次方这个数字有多大,没什么概念。这么说吧,这个量比地球上的沙子还多,多出多少呢?也就是它的几亿或几十亿倍吧。

所以正常情况下,完全不用担心哈希碰撞的问题,因为概率太小了。

不投资毋宁死

自由,就是拥有选择的权利,而每一次选择都是一次投资。

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

扫码关注云+社区

领取腾讯云代金券