Hash 值是区块链上常用到的一个概念。简单说来Hash值是一段信息的摘要 (文件的身份证号码)。具有固定长度,唯一性,以及不可逆性。哈希值可用于许多操作,包括身份验证和数字签名。
1:什么是Hash值:
Hash值(信息摘要)就是给信息通过一定的方法赋予一个简化的代号,简化后的代号就是这段信息的Hash值。类似于让一个居民获得身份证号码。居民的名字就是信息本身,身份证编号的方式就是Hash函数,而身份证号就是这段信息的Hash值。
2:Hash值的特点
固定长度:同一种处理方式得到的Hash值长度一定,例如常用的MD5算法就给信息赋予128bit,也就是128个0和1的二进制串。为了便于理解,将128个0和1的二进制串转换成了16进制。由于每4个bit表示一个16进制,所以128/4 = 32 换成16进制表示后,为32位了。这和居民身份证号码一样,每个人的身份证的号码长度都是固定的(现在的长度一般为18位)。
唯一性:任何一段信息只能有唯一的Hash值 (一个居民只能有一个身份证号)。即便是改变信息 中的任何一个内容,就会引起整个Hash值出现巨大的差别。例如以下两个信息虽然只有一个字母的差别,但Hash值经过MD5运算后差别巨大。由于Hash值具有128bit,两个Hash相同的概率是2的128次方之一。但因为存在着生日攻击(就是有同一天生日的人的人群数只需要约70人而非我们第一映像中的366人)的情况,两个Hash相同的概率是2的64次方之一,这是一个极小极小的数字——而即便是在MD5被王小云教授破解之后,其碰撞概率上限也高达2的40次方分之一。
MD5("version1") = "966634ebf2fc135707d6753692bf4b1e";
MD5("version2") = "2e0e95285f08a07dea17e7ee111b21c8";
不可逆性:这个与用果汁机榨果汁很类似。你可以把苹果榨成苹果汁和果渣,但不可能把苹果汁和果渣还原成苹果。从Harsh值不可能推算出原本的信息是什么。
3: 为什么需要Hash值(数据摘要)
(a)便于数据的查找:因为数据内容可能很大,如果在查找数据时需要将所有的数据都全部浏览一遍,效率就会非常低下。但如果将每个数据后面都能通过一个函数将其用编号表示,那在查找数据时就可以简单查找有限的编号即可。例如我想要在电脑中查询信息"区块链学习笔记一Hash值的含义"可以简单的查找Hash值为“0001”的文档。
"区块链学习笔记一Hash值的含义"---》Hash函数---》“0001"
(b)便于数据的校验:这是Hash值最重要的作用之一。由于Hash值的以上一些特点,当收件人在收到信息后只需要对文件Q'进行一次Hash运算,如果得到的Hash值与其收到的Hash值一致,则可以断定文件Q'=文件Q即文件没有遭到篡改。
也正是基于Hash值可校验的特点,可以将Hash值与二叉树Merkle Tree结合。二叉树Merkle Tree中每个非叶子节点节点下面分两个枝干,每个非叶子节点的Hash值可以根据它下面所有的叶子节点值进过一定的运算得到。故收件人可以在收到信息后,先比对节点1的Hash值,若节点1没有错误则无需进行进一步的比对。若发现节点1错误可以继续比对节点2和3的值。发现节点3无误则可以放弃比对节点6和7. 找到错误来自节点2,再依次对节点4和5运算Hash值并发现错误源于自节点4.然后收件人可以重新要求发信人发送节点4的数据从而使整个数据和发件人的保持一致。
参考资料:
(2)hash与消息摘要的关系是什么?知乎 车小胖
(3)到底什么是hash?知乎
(4)生日攻击是什么,有什么用? 知乎 月海