哈希算法又叫摘要算法(Digest),将给定数据转化成固定长度、不规则的数据。
哈希函数在计算机内部进行一些数值计算,目的就是为了验证原始数据是否被篡改。
第一特征
输出值的数据长度不变
- 输出数据的长度取决于哈希函数,例如在SHA-1的情况下,它固定为20个字节
- 即使输入非常大的数据,输出的哈希值数据长度也不会改变
- 同样不管输入的数据有多小,哈希值的数据长度是相同的
第二特征
相同的输入,输出必定相同
第三特征
即使输入了相似的数据,如果它们相差一个字节,输出也会有很大的不同
第四特征
即使输入完全不同的数据,输出相同的哈希值会以低概率出现,这种现象是哈希值冲突。
哈希碰撞是指,两个不同的输入得到了相同的输出。
哈希碰撞能不能避免?
碰撞是一定会出现的,因为输出的字节长度是固定的,但输入的数据长度是不固定的,有无数种输入。哈希算法是把一个无限的输入集合映射到一个有限的输出集合,必然会产生碰撞。
碰撞概率的高低关系到哈希算法的安全性,一个安全的哈希算法必须满足:
- 碰撞概率低
- 不可能通过哈希值来反推原数据
常用的哈希算法
MD4
、MD5
、SHA-0
、SHA-1
、SHA-2(SHA-256和SHA512)
根据碰撞概率,哈希算法的输出长度越长,就越难产生碰撞,也就也安全。
代码示例