用散列函数来做散列

154 阅读2分钟

这是我参与2022首次更文挑战的第33天,活动详情查看:2022首次更文挑战

用散列函数来做散列

还记得你小时候创建和解析密文时用的密码吗?

例如以下这种字母和数字的简单转化方式。

A=1 B=2 C=3 D=4 E=5

以此类推。

由此可得,ACE会转化为135,CAB会转化为312,DAB会转化为412,BAD会转化为214。将字符串转为数字串的过程就是散列,其中用于对照的密码,就是散列函数

当然散列函数不只是这一种,例如对各字母匹配的数字求和的过程,也可以作为散列函数。按此函数来做的话,BAD就是7,过程如下。

第1步:BAD转成214。

第2步:把每一位数字相加,2+1+4=7。

散列函数也可以是对各字母匹配的数字求的过程。这样的话,BAD就会得出8。

第1步:BAD转成214。

第2步:把每一位数字相乘,2×1×4=8。

本章剩余部分将会采用最后一种散列函数。虽然现实世界中的散列函数比这复杂得多,但以简单的乘法函数为例会比较易懂。

一个散列函数需满足以下条件才有效:每次对同一字符串调用该散列函数,返回的都应是同一数字串。如果每次都返回不一样的结果,那就无效。

例如,计算过程中使用随机数或当前时间的函数就不是有效的散列函数。这种函数会将BAD一下转成12,一下又转成106。

我们刚才的乘法函数就只会把BAD转成8。因为B总是2,A总是1,D总是4,2×1×4总会是8,不可能有其他输出。

注意,经由此函数转换,DAB会得到8,跟BAD一样。这确实会带来一些问题,我们之后会说明。

认识了散列函数,就可以进一步学习散列表的运作了。