说起区块链,似乎大家都懂一点,再往细里一问,似乎又都不懂了。
比如,你问一个人:为什么要挖矿,挖的到底是啥。
怕是没几个明白人。
本文就是要给你讲明白!
前言
人们一说起区块链,就常常说防篡改防篡改,那么,这个防篡改是怎么做到的呢。
主要靠HASH。
人们所常说的挖矿,其实是在挖HASH。
挖一个长得很好看的HASH。
但,什么是HASH?
外行人是说不清的,内行人,似乎也很少能给外行人讲明白。
很多人喜欢用比喻的方式给外行人讲HASH,其实,你就是弄100个比喻(什么麻将、扑克、骰子啥的),不懂HASH的人还不懂。
他们中比较傻白甜的,甚至会想,挖矿是在挖麻将吗?
真正想弄明白HASH,就让他看看HASH长什么样子呗!!
HASH到底是个啥
HASH是一个算法,你给它一串数,它给你一串数。
你给它的叫输入,它给你的叫输出。
也就是说,将数据输入给HASH函数,HASH函数输出一串数。
HASH( 输入 )= 输出
这就好比你把一头猪输入给一个香肠机,香肠机给你输出一段香肠。
看个例子吧,我们以最常见的HASH算法MD5为例。(当然,有很多种HASH算法,MD5是其中最知名的一个。)
MD5 ("weijianfan") = c49262b1117b9fd1d6ebd74aaa016f3e
上面这个例子中,“weijianfan”是输入,后面那串数是输出。
再如:
MD5 ("weiyuerenhua") = a799c7c504a1a80f95ebe69a86c42637
注意,HASH函数有个重要的特点,不管输入多长,输出都是固定长度的。
当然,和一般的算法一样,只要输入不变,输出是不变的。
比如MD5,输入是不限制长度的,输出就是128位的二进制,也就是16个字节的十六进制。像上面第一个例子里,c4就是一个字节,代表了8位的二进制,即11000100,最后那个3e也是一个字节,也即00111110
我们把输入搞长点:
MD5 ("In Math We Trust.") = 767fa54f12bab6b71fb411f265814bb7
把汉字作为输入:
MD5 ("博鳌亚洲论坛2021年年会数字支付与数字货币分论坛4月18日晚举行。") =
36b5e89c797d22d14ccefe4ec79f56c2
再搞长点:
MD5 ("Andreas M. Antonopoulos is a noted technologist and serial entrepreneur who has become one of the most well-known and well-respected figures in bitcoin. An engaging public speaker, teacher, and writer, Andreas makes complex subjects accessible and easy to understand. Andreas advises multiple technology startups and speaks regularly at conferences and community events around the world.") = 5ac503b01e213d4794d92134096ad313
长一点的汉字:
MD5 ( "Andreas M. Antonopoulos 是⼀位著名的技术学家和连续创业企业家,⽐特币界最著名和倍受尊敬的⼈物之⼀。⾝为⼀名迷 ⼈的公共演说家、教师和作家,他善于把复杂的问题变得简单⽽易于理解。作为⼀名顾问,他则帮助初创者认知、评估并指 引减⼩安全和业务风险。") =
90f039293e0b3da5516e251b93434795
HASH还有一个特点,只要输入有一点点的变化,输出都会完全不同,就好像输入是完全不同的。
比如把上面这段文字中“一位”里的“一”字删掉,再做HASH:
MD5 ("Andreas M. Antonopoulos 是位著名的技术学家和连续创业企业家,⽐特币界最著名和倍受尊敬的⼈物之⼀。⾝为⼀名迷 ⼈的公共演说家、教师和作家,他善于把复杂的问题变得简单⽽易于理解。作为⼀名顾问,他则帮助初创者认知、评估并指 引减⼩安全和业务⻛险。") =
159c9d192e45fbd2eaa0c3f068a78508
看到了吧,输入有微小的变化,输出会完全不同。
HSAH对输入是不挑的,不管是字符串,还是文件,不管是文本、图像、视频,只要是数字的,都当作二进制输入就是了。
比如,把下面这幅图像给MD5,可以得到:
MD5 (Emily Blunt.jpg) = b818d284ef28f733c701f7bc1ee5f669
如果你的电脑上有md5工具,你就可以试试自己做HASH,比如在mac电脑里,在“终端”中输入md5 -s "xxx",或者md5 1.txt就可以对字符串或者文件进行md5。
若干G的视频文件也没问题:
MD5 (伟大的转折-01.mp4) =
9093c85d13f79609978f52c48e19aa65
图|38集革命历史剧《伟大的转折》,遵义会议会址
你哪怕是改动了这个视频中任何一帧的任何一个像素,MD5算出来的结果都截然不同。
所以,判断一个文件是不是被人改动过,算一下HASH就行,HASH只要没变,文件就没有被动过。(前提是这个HASH算法还不错!)
现在你对HASH大概有点印象了吧,反正只要是数字的输入,都能给你整出一段固定长度的输出,而且个个都不一样。