哈希算法有时候被称之为摘要,这个比喻有点不精确,因为摘要毕竟还是要让人看懂的,而哈希算法后的数字,人是完全读不懂的。而且我们哈希后的字符串可能比原文还要长,所以这个比喻不太恰当。
简单来说,通过哈希算法:
-
同样的输入一定会有同样的输出。但你拿输出要想还原输入则不可能。
-
无论多长或者多短的输入,输出都是一样长的。
-
改动一点点,输出就会完全不一样,且毫无规律。
用点例子就秒懂了。
我们这里用Python现成的库来实验SHA256算法。
运行结果:
输出:185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
完全看不懂是什么,重点是当我们知道输出是185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
完全没办法还原成原始信息Hello,但这不是随机数。
只要输入信息一致,结果肯定是完全一样:
如果输入有哪怕一点点小小的不一样,结果会完全不同,并且完全无法预测。
只是把Hello的第一个字母改成小写的h,两者的结果完全看不出联系。
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824这个结果和185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969是看不出啥联系的,这个效应称之为“雪崩效应”。
也就是说,
哪怕任何一点点不同的输入都能保证有不同的输出,并且不可逆。
并且,长度不一样的信息哈希后,长度是一致的。
不同长度的字符串哈希后,结果的长度是一致的。
这里有个问题,输出的字符串的长度必然是一致的话,哈希的结果应该是有穷的。但我们输入的信息可能性是无穷的,这意味着必然有“撞车”事件发生。理论上是的,但不必担心,这种事情发生的概率很小,可以忽略不计。
哈希算法的用处很多,比如我们验证文件下载是否完整时,就会应用到。因为哪怕一个字节有不一样,雪崩效应也会让哈希后的值完全不一样,所以哈希值一样可以保证你下载的文件和上传者的完全一致。