哈希函数是干啥的?
哈希函数可以把给定的数据转换成固定长度的无规律数值。
这个被转换后的无规律数值可以作为数据摘要应用于各种场景。
我们不妨把哈希函数想象成一个机器,将数据输入到机器后,这个机器会输出固定长度的无规律数值。
这个“无规律数值”就是所谓的“哈希值”。
而且我们可以发现,哈希值是用十六进制来表示的。
下面来讲一下哈希函数的几个特征。
第一个特征是输出的哈希值数据长度不变,你管你输入的数据有多小或者有多大,输出的哈希值的长度是相同的。
第二个特征是,如果输入的数据相同,那么输出的哈希值必然相同。这个特征其实就是函数本来就有的特征了,对于给定的x,都有唯一的一个y值与之对应。
第三个特征是即使输入的数据十分相似(哪怕只有一比特的差别),输出的哈希值也会有很大的差异。也就是说,输入相似的数据并不会导致输出的哈希值也相似。
第四个特征是,即使输入的两个数据完全不同,输出的哈希值也是有可能相同的(虽然出现这种情况的概率比较低)。我们把这种情况叫做“哈希冲突”。
第五个特征是,不可能根据哈希值反向推算出原本的数据。
哈希函数可以应用于各种各样的场景,比方说哈希表、消息认证码等。
我们访问一个网站或者app需要输入密码,这个密码不是被直接保存到服务器的。如果是这样的话就太危险了。
都是先算出密码的哈希值,只存储哈希值到数据库中。
我们作为用户登陆某个网站的时候,会先算出该密码的哈希值,拿这个哈希值和服务器中的哈希值进行比对。
这么做有什么好处呢?
好处在于,就算你保存的哈希值暴露了也不碍事,因为刚才提到了哈希函数的第五个特征:“输入输出不可逆”。这样安全性就得到了保障。