首页 神奇的哈希HASH
文章
取消

神奇的哈希HASH

在上一篇文章中,我们介绍了比特币的交易过程,其中涉及到了哈希(英文名:HASH)。这篇文章我们就来聊一聊神奇的哈希。

1.哈希用于在新的比特币转账凭据里附加上一个转账凭据

我们先来回顾一下哈希出现的位置:

交易

我们在上一篇文章中曾经比喻道:所有者2在把比特币转给所有者3时,需要写一张转账凭据,我们称为转账凭据B,就是上图中的第三笔交易。同时所有者2为了证明自己真的拥有这枚比特币,他/她还需要把所有者1给他/她的转账记录,也即转账凭据A(上图中的第二笔交易),也给附加到转账凭据B里边。你可以想象成是有两张纸条,转账凭据A和B,然后所有者2在转账凭据B上用胶水粘上了转账凭据A。

当然在数字世界里肯定不能用胶水了,那么转账凭据A(也即第二笔交易)是如何被附加到转账凭据B(第三笔交易)里边的呢?

就是通过哈希。在上图里我们也可以看到,第二笔交易有一个实线箭头指向了第三笔交易上,指向的位置就是第三笔交易的哈希。这个就是我们说的把转账凭据A附加到转账凭据B里的过程。这个附加的过程实际上是把转账凭据A(也即第二笔交易)也作为哈希计算的一个输入值给参与到了计算中,这样它就体现在了转账凭据B(第三笔交易)里。

那这个哈希到底长什么样子呢?其实看起来就是一串数字和字母的随机组合,比如这样:

d3f58fff16a7b561a551964d0269270aa1b52cd9d6f5dc5133d41fcfd3edcf72

这串数字和字母的随机组合,其实是本公众号名称“流向未知”这四个字的哈希值。哈希值看起来是随机的数字和字母的组合,但实际上却对应着有实际意义的文字。

2.哈希值是怎么产生的?

函数我们在学校都学过,一般记为 f(x),其中的x是函数的输入值,而经过f函数的计算,会得到一个输出值,即 f(x)。比如有一个函数是 f(x)=x+1,如果我们把这个函数的输入值设定为1,那么函数的计算结果,也即输出值就是 f(1)。这个我们口算一下就能得到结果是2,也即 f(1) = 1 + 1 = 2。

而哈希值是哈希函数的计算结果,哈希的英文是HASH,所以一般把哈希函数记为 h,哈希值就是 h(x)。

哈希函数仍然是有输入值和输出值,它特别的地方在于其可以将任意长度的输入数据通过哈希算法转换成固定长度的输出。就拿MD5和SHA256这两种常见的哈希算法来说,任意长度的数据经过MD5算法计算后得到的输出结果都是128位,而经过SHA256算法计算后的结果则是256位。

注意,这里的位是二进制意义上的表述,不是指我们看到的字符数。如果按我们看到的字符数算的话,MD5算法产生的计算结果应当是32个字母和数字的组合,SHA256算法则是64个字母和数字的组合。

比如,本公众号的名称“流向未知”采用MD5算法计算后得到的哈希值是 48814813d0ab7ee0d886922b82b0172f ,而经过SHA256算法计算后的哈希值则是 d3f58fff16a7b561a551964d0269270aa1b52cd9d6f5dc5133d41fcfd3edcf72 ,也即本文第一部分的那串字符。

回到比特币的交易过程。从前文的图中我们可以看到,每笔交易中都记录有一个哈希值。这个哈希值就是将上一笔交易和接收者的公钥进行哈希计算得到的。

另外,比特币使用的哈希算法是SHA256,英文为secure hash algorithm,中文意思是 安全哈希算法。这是一种在加密领域经常使用的哈希算法,在后续的文章中你还会再看到该算法的身影。

3.哈希的特点

  1. 哈希碰撞

    因为哈希函数的输入值是任意的,这也就意味着有无限种可能的输入。但是输出值因为是固定长度的,所以虽然输出值的数量上限非常大,但其仍然是有上限的。这也就意味着,总是存在着不同的输入值经过哈希计算后会得到相同的输出值。即,肯定存在不同数据的哈希值相同。这种情况就称为哈希碰撞(hash collision)。

    好的哈希算法需要尽可能避免哈希碰撞的发生。

  2. 无规律,不可预测

    哈希函数计算出的哈希值是一串无规律的数字和字母的组合。在还没有计算一段数据的哈希值之前,无法推断出它的计算结果。

  3. 单向性

    通过哈希函数,我们可以非常方便地计算出一个数据的哈希值。 但是想要通过一个哈希值来计算出它原本的数据,则是几乎不可能的事情。这也是哈希算法可以作为加密算法的原因。因为哈希值的无规律性,几乎无法通过哈希值倒推出原来的数据。那么哈希值其实就是原来数据的密文了。

  4. 计算速度快

    想要计算一段数据的哈希值非常快,即使这段数据很长。

4.哈希函数的用途

由于前边提到的哈希的这些特点,哈希算法有很多用途,最常用的就是防数据篡改:

对一段数据采用相同的哈希函数计算出的哈希值总是相同的。但是如果一旦修改了输入的数据,那么哈希函数计算出的哈希值都会发生巨大变化,且这种变化毫无规律。再加上哈希计算非常快速简单且哈希值比较短,因此在网络上传输数据时,可以将这段数据的哈希值作为对数据完整性和未篡改的证明。可以说,一段数据的哈希值就是这段数据的数字指纹。前文提到的MD5算法就经常被用在这种途径中,其实MD5算法的英文全称Message-Digest Algorithm的中文含义就是数据摘要算法。

在比特币的交易过程中,每一笔交易就是通过哈希函数附加到下一笔交易中的。区块链中各个区块的连接也是靠把上一个区块数据的哈希值写到下一个区块里来实现的,这个我们后续会讲到。

5.结语

由于篇幅限制,本文只是简单介绍了哈希是什么样子,它的特点和用途。对于原理,我们后边另找机会单独介绍。

简单却神奇的哈希函数不仅在比特币交易过程中的凭据附加部分至关重要,而且它也是区块链的基石技术之一。正是哈希将一个个区块链接在一起,形成了区块链(区块链上的每一个区块中都记录了上一个区块的哈希值,这点我们后续会讲到)。

下一篇文章,我们来聊聊区块链的另一个基石技术,非对称加密。交易过程中的公钥、私钥和数字签名都是非对称加密技术。我们下一篇文章见。

本文由作者按照 CC BY 4.0 进行授权

我们处在这么好的时代,何不更冒险一点

非对称加密