区块链中的哈希(Hash)值、哈希函数是什么?

 2023-08-01 13:20:42发布 2023-08-29 13:22:32更新

哈希值,即 Hash 值,通常用一个短的随机字母和数位组成的字串来代表,是一组任意长度的输入信息通过哈希算法得到的“数据指纹”,即进行加密运算得到的一组二进制值。

因为电脑在底层机器码是采用二进位的模式,因此通过哈希算法得到的任意长度的二进位值映像为较短的固定长度的二进位值,即哈希值。

 

哈希值的作用

哈希值在文件校验和签名中扮演着重要角色,它的主要用途是判断两个文件是否相同。

例如,当我们从网络上下载一个文件时,我们可以通过比较它的哈希值和原始文件的哈希值来判断下载的文件是否完整无损。

如果两个哈希值相同,那么这两个文件是完全一致的,下载过程中没有出现损坏的情况;如果两个哈希值不同,就意味着下载得到的文件与原始文件不同,它在下载过程中可能受到了损坏。

这样可以避免病毒或恶意代码的“入侵”,保障网络传输过程中数据的完整性及安全性。

 

哈希函数

哈希函数(Hash Function),也称为散列函数或杂凑函数。

哈希函数是一个公开函数,可以将任意长度的消息 M 映射成为一个长度较短且长度固定的值H(M),称H(M)为哈希值、散列值(Hash Value)、杂凑值或者消息摘要(Message Digest)。

它是一种单向密码体制,即一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。

函数表达式为:h=H(m)

无论输入是什么数字格式、文件有多大,输出都是固定长度的比特串。

以比特币使用的 Sh256 算法为例,无论输入是什么数据文件,输出就是 256bit。

每个 bit 就是一位 0 或者 1,256 bit 就是 256 个 0 或者 1 二进制数字串,用 16 进制数字表示的话,就是多少位呢?

16 等于 2 的 4 次方,所以每一位 16 进制数字可以代表 4 位 bit。那么,256 位 bit 用16 进制数字表示,当然是 256 除以 4 ,即 64 位。

也就是你通常看到的哈希值:

00740f40257a13bf03b40f54a9fe398c79a664bb21cfa2870ab07888b21eeba8

 

哈希函数的特点

易压缩

对于任意大小的输入 x,Hash 值的长度很小,在实际应用中,函数 H 产生的 Hash 值其长度是固定的。

易计算

对于任意给定的消息,计算其 Hash 值比较容易。

单向性

对于给定的 Hash 值,要找到使得在计算上是不可行的,即求 Hash 的逆很困难。在给定某个哈希函数H和哈希值H(M)的情况下,得出M在计算上是不可行的。即从哈希输出无法倒推输入的原始数值。这是哈希函数安全性的基础。

抗碰撞性

理想的 Hash 函数是无碰撞的,但在实际算法的设计中很难做到这一点。

在抗碰撞性方面,有两种不同的情况。

一种是弱抗碰撞性,指对于给定的消息,实际上是不可能找到另一个消息来产生相同的哈希值,这在计算上是不可行的。

另一种是强抗碰撞性,指对于任意的两个不同的消息,使其产生相同的哈希值在计算上也是不可能的。

高灵敏性

这是从比特位角度出发的,指的是 1 比特位的输入变化会造成 1/2 的比特位发生变化。消息 M 的任何改变都会导致哈希值 H(M)发生改变。即如果输入有微小不同,哈希运算后的输出一定不同。

推荐阅读