哈希函数是什么?
理论上,哈希函数是一种数学计算的流程,它可以把(输入的)任意长度的数据转化成(输出的)固定长度的数据。
在数学上,哈希函数用y =hash(x)表示,输入x进行运算,得到一个哈希值y。这个y有另一个叫法:摘要,类似于论文中的摘要,不管正文中的内容有多大,哈希函数总能用固定长度的数据来表述正文里的所有内容。
常使用的哈希算法包括MD5、SHA-1、SHA-256、SHA-384及SHA-512等。比特币协议中,这个哈希函数是SHA-256。2008年,中本聪发明比特币时采用的这个SHA-256被公认为最安全最先进的算法之一。
除了生成地址中有一个环节使用了REPID-160算法,比特币系统中但凡有需要做Hash运算的地方都是用SHA-256。
哈希函数SHA-256
SHA (Secure Hash Algorithm,安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数,经历了SHA-0,SHA-1,SHA-2,SHA-3系列发展。比特币采用的SHA-256算法属于SHA-2系列。
SHA-256是将任何一串数据输入到SHA-256将得到一个256-bit (32-byte) 长度的Hash值(散列值)。为什么中本聪会选择用在比特币协议中使用这个函数呢?原因很简单:
(1)输出固定长度
无论输入多长的数据,哈希函数的输出长度永远都是固定的。
(2)不可逆
又叫做单向性,输入x可以得到y,但输入y是无法得到x的。这个特点很重要。
在现实世界中,存储密码是哈希函数应用中的一种。当我们上网的时候,经常需要注册账户,并设置密码,这种密码就是经过哈希函数处理的。官方服务器存储的是这个密码信息的哈希摘要。
当我们下一次重新登录的时候,输入帐号和密码。服务器就会经过相同的哈希函数处理你的密码,然后判断这个结果是否与之前存储的哈希摘要相匹配。
这就意味着,即使有黑客攻破了服务器,得到了你账户密码的哈希摘要,他也没有办法通过这个摘要获得你的真实帐号和密码。就是因为哈希函数的不可逆性。
(3)防篡改性
只要输入的x发生改变哪怕只是一个字节的改变,经过哈希函数处理之后的y就会发生改变。这个是区块链的核心技术。在我们做大规模文本比对的时候,这个性质能直接帮我们减少计算耗时。
但是,哈希之后能取到的值,范围总是有限的,而 X 的取值却可以是无限的,因此一定存在两个不同的 X,hash之后取到相同的y,比如仍以取余为例,当X=3 时,f(3)=2,这与 x=234 是一样的,这就叫“冲突”或“碰撞”。
上面我们讲过,哈希函数可以用来存储密码,所以我们不希望两个不同的输入x值,能够得到相同的输出y值。换句话说,我们不希望哈希函数出现碰撞的情况,即使一个也不行。
因缺思婷的是,我们虽然无法消除碰撞的存在,但却有保证能找到碰撞的方法。
给一个256位输出大小的哈希函数找到碰撞,我们可以考虑以下这个简单的方法:
选出2的256次方+ 1个不同的值,计算出每个值的哈希值,然后检查是否有两个输出值是相同的。因为我们选择的输入值的数量超过了输出值全部可能的数量,那当你运用哈希函数计算时就至少会有一对数值碰撞了。
而比特币的产生,就是利用这种“哈希碰撞”。
- End -
领取专属 10元无门槛券
私享最新 技术干货