参考:
https://www.zhihu.com/question/20820286
http://www.360doc.com/content/19/1101/16/42427018_870494130.shtml
https://www.cnblogs.com/rednodel/p/4361874.html
简单的定义:哈希算法其本质上就是将一个数据映射成另一个数据,通常情况下原数据的长度比hash后的数据容量大。这种映射的关系我们叫做哈希函数或者散列函数。散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位
常见的构造散列函数的方法有
- 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a×key + b,其中a和b为常数(这种散列函数叫做自身函数)
- 数字分析法
- 平方取中法
- 折叠法
- 随机数法
- 求模取余法
特点
- 加密过程不可逆,意味着我们无法通过输出的散列数据倒推原本的明文是什么
- 输入的明文与输出的散列数据一一对应,任何一个输入信息的变化,都必将导致最终输出的散列数据的变化
- 在区块链中,通常使用SHA-256(安全散列算法)进行区块加密,这种算法的输入长度为256位,输出的是一串长度为32字节的随机散列数据。
- 区块链通过哈希算法对一个交易区块中的交易信息进行加密,并把信息压缩成由一串数字和字母组成的散列字符串。区块链的哈希值能够唯一而准确地标识一个区块,区块链中任意节点通过简单的哈希计算都可以获得这个区块的哈希值,计算出的哈希值没有变化也就意味着区块中的信息没有被篡改。
Hash 和 加解密对比
哈希算法
一个可靠的哈希算法,应该满足:
对于给定的数据M,很容易算出哈希值X=F(M);2.根据X很难反算出M;3.很难找到M和N使得F(N)=F(M)。
- 密码学中的哈希函数有3个重要的性质,即抗碰撞性、原像不可逆、难题友好性。碰撞性,就是指阿呆事先找出一奇一偶使得哈希结果一致,但这在计算上是不可行的。
- 把大空间的消息压缩到小空间上,碰撞肯定是存在的。假设哈希值长度固定为256位,如果顺序取1,2,…2^256 1, 这2^256 1个输入值,逐一计算其哈希值,肯定能找到两个输入值使得其哈希值相同。但不要高兴的太早,因为你得有时间把它算出来,才是你的。
- 根据生日悖论,如果随机挑选其中的2^128 1输入,则有99.8%的概率发现至少一对碰撞输入。那么对于哈希值长度为256位的哈希函数,平均需要完成次哈希计算,才能找到碰撞对。如果计算机每秒进行10000次哈希计算,需要约年才能完成次哈希计算。
用途
用来验证信息的完整性,因为如果信息在传递过程中被篡改,那么运行哈希计算得到的哈希值与原来的哈希值不一样。在区块链中,哈希函数的抗碰撞性用来做区块和交易的完整性验证,一有篡改就能被识别出来