哈希函数就是宇宙级扭蛋机

我们知道区块链中的信息块,是通过加密方式连接在一起。
那么,区块链是如何加密?如何链接?
为了弄清楚这些知识,我们需要一些基础概念: 函数、哈希函数和公钥密码学。今天先讲讲函数和哈希函数。
有的同学会说,看到数学公式就头疼。但是这一部分并不难,不信?瞧瞧呗。
函数
哈希函数,首先它是一个函数。那么,什么是函数?
抽象地说,函数是一种——接受输入,并根据输入的内容产生输出的东西。
数学术语中,函数是一组输入和一组输出之间的关系,其中每个输入只与一个输出有关。
函数通常写为 f,输入通常表示为 x。
比如:
f(x)= x + 2
函数:  f(x)
输入:x
输出:x + 2。
如果我们输入2,会得到4。
如果我们输入3,会得到5。
依此类推。
函数就像小朋友玩的扭蛋机。
函数 f  (x):扭蛋机
输入 x:十个1元硬币
输出:扭蛋1个
如果我们塞入20个1元硬币,那么得到两个扭蛋。依此类推。

哈希函数就是宇宙级扭蛋机

什么是哈希函数?
哈希函数,是输入任意长度的字符串,都可以产生固定长度输出的函数。
做个实验。网站:https://anders.com/blockchain/hash.html 可以产生哈希值。
试一试,输入不同的值,会得到不同的输出,但是输出长度一样。
比如:
输入:爱莉莎
输出:73abcafdf5b6f5de5a217da2416c4ca1eb35aab10be66eec4ab75867d1ba5abe
如果更改输入数据,则会得到一个新的哈希值。
哈希函数就是宇宙级扭蛋机

输入:elizachen
输出:c1a14f43c993ee4c648bac6831e3798cf41efb0841b1b929a63ddb8ddbdb5b8e
哈希函数就是宇宙级扭蛋机

改回 爱莉莎,那么输出又恢复成 73abcafdf5b6f5de5a217da2416c4ca1eb35aab10be66eec4ab75867d1ba5abe。
输入不同长度的字符(比如 “爱莉莎” 和 “elizachen”字符长度不一样),得到的输出,长度一样。
比特币采用的SHA-256,产生的输出长度,就是256bits,32个字节(一个字节8bits,所以是256/8 = 32字节)。
加密哈希函数
加密哈希函数,是特殊的哈希函数。为了达到密码安全,需要满足下面的特性:
1. 确定性
同一个输入生成同一个的输出。无论用哈希函数计算多少次,都会得到相同的结果。
可以去https://anders.com/blockchain/hash.html  试一试。
而且一个输入,产生唯一一个输出,因此,我们也说,哈希函数为你输入的数据,生成了——数字指纹。
2. 隐秘性
同时,哈希函数被称为:单向函数。单向函数的意思就是:你可以从输入得到输出,但如果只有输出,几乎不能找出输入。
为什么说几乎不能? 因为通过输出,得到输入值的唯一方法是——“暴力破解法”。
暴力破解:任意选择一个输入,计算其输出(哈希值)。然后与现有的输出对比,看看是否一致。不断重复这一过程,直到找到一个输入,它的输出值与现有输出值一致。
继续拿扭蛋机举例:
但如果扭蛋机原来装了50个硬币,我再投入10个,共计60个硬币,如何找到我塞的那10个硬币呢?
(为了实验,我在我的10个硬币上,都画了一个红点,并请工作人员打开扭蛋机,拿出了里面的硬币。)
最好的情况:1次。 一把抓10个,全部有红点,第一次就找到了。但这种情况几乎不可能的。
最坏的情况:50次,才得到答案,也就是翻了50个都不是,后面10个才是。
平均的情况:平均情况下,我们要尝试 50 / 2 = 25 次之后才能找到答案。
似乎也可以接受。
但是,如果我们处理的是256bits的哈希值呢?
最好的情况:1次。第一次就找到了答案,这种情况比中500万还难。
最坏的情况:尝试 2^256 -1 次。就是试过所有可能的输入。
平均的情况: 尝试 2^256 / 2 = 2^255 次 = 5.7896045e+76。 这可是个天文数字!如果哈希函数是一台扭蛋机,那就被塞了5.7896045e+76枚硬币,那是像宇宙那样大的扭蛋机吧!想要找出我塞的硬币?不可能!
比特币使用的SHA-256 哈希函数,需要平均计算5.7896045e+76次,才有可能得到正确的输入,这几乎是不可能的。
3. 无碰撞
对于哈希函数H,无法找到两个值x和y(x≠y),使得H(x)=H(y)。即发生下面这种情况。

哈希函数就是宇宙级扭蛋机

这是加密哈希函数的一个重要属性。
加密哈希函数发生碰撞也几乎是不可能的。目前人类制造的计算机,从宇宙开端(开天辟地)开始计算,直到现在,发现碰撞的可能性也无穷小。小到比地球1分钟后就被流星撞击毁灭的几率还要小。
区块链如何使用哈希函数?
在比特币中:
函数:加密哈希函数(SHA – 256)
输入:上一个区块的Hash值、序号X、记账时间、交易记录
输出:固定长度的Hash值 (将作下一个区块的输入)
挖掘过程中,比特币使用哈希函数将新的交易编写到区块链中。