通俗易懂的哈希算法讲解
哈希是一种加密算法。哈希函数(Hash Function),也称为散列函数或杂凑函数。哈希函数是一个公开函数,可以将任意长度的消息M映射成为一个长度较短且长度固定的值H(M),称H(M)为哈希值、散列值(Hash Value)、杂凑值或者消息摘要(Message Digest)。它是一种单向密码体制,即一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。它的函数表达式为:h=H(m)。无论输入是什么数字格式、文件有多大,输出都是固定长度的比特串。以比特币使用的Sh256算法为例,无论输入是什么数据文件,输出就是256bit。每个bit就是一位0或者1,256bit就是256个0或者1二进制数字串,用16进制数字表示的话,就是64位。于是你通常看到的哈希值,就是这样的了:00740f40257a13bf03b40f54a9fe398c79a664bb21cfa2870ab07888b21eeba8。这是从btc.com上随便拷贝的一个哈希值,不放心的话你可以数一下,是不是64位~
哈希函数具有以下特点:
- 易压缩:对于任意大小的输入x,Hash值的长度很小,在实际应用中,函数H产生的Hash值其长度是固定的。
- 易计算:对于任意给定的消息,计算其Hash值比较容易。
- 单向性:对于给定的Hash值,要找到使得在计算上是不可行的,即求Hash的逆很困难。在给定某个哈希函数H和哈希值H(M)的情况下,得出M在计算上是不可行的。即从哈希输出无法倒推输入的原始数值。这是哈希函数安全性的基础。
- 抗碰撞性:理想的Hash函数是无碰撞的,但在实际算法的设计中很难做到这一点。有两种抗碰撞性:一种是弱抗碰撞性,即对于给定的消息,要发现另一个消息,满足在计算上是不可行的;另一种是强抗碰撞性,即对于任意一对不同的消息,使得在计算上也是不可行的。
- 高灵敏性:这是从比特位角度出发的,指的是1比特位的输入变化会造成1/2的比特位发生变化。消息M的任何改变都会导致哈希值H(M)发生改变。即如果输入有微小不同,哈希运算后的输出一定不同。
哈希算法是将输入数据转换成数字,以便快速查找或验证。比如,将网址A转换成数字1,网址B转换成数字2,这样就可以通过数字快速查找出对应的网址信息。哈希算法也可以用于判断某个数据是否在一组数据中。比如,有一万首歌曲,如果存在一种方式,能将每首歌的数据浓缩到一个数字(哈希码)中,那么可以用同样的算法计算新的歌曲X的编码,看看是否在之前的数字中,就能知道歌曲X是否在那一万首歌中。
哈希算法具有以下特点:
- 对于给定的数据M,很容易算出哈希值X=F(M);
- 根据哈希值X很难反算出原始数据M;
- 很难找到不同的数据M和N使得它们的哈希值相同;
- 具有抗碰撞性,即使找到另一个消息,使得在计算上是不可行的;
- 高灵敏性,输入的微小改变会导致输出的巨大变化。
常见的哈希算法包括SHA-1、SHA-2、SHA-3、RIPEMD160等。每种算法都有不同的特点和适用场景。比特币使用的Sh256算法是一种常见的哈希算法,它具有固定的输出长度和高度的抗碰撞性,用于保证区块和交易的完整性验证。在挖矿过程中,哈希函数的难度值被用来控制产生合法区块的难度,保证区块的生成速率稳定。哈希函数在密码学和区块链等领域有着广泛的应用。