这是我参与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一样。这确实会带来一些问题,我们之后会说明。
认识了散列函数,就可以进一步学习散列表的运作了。