谁能推荐一种首选的算法来缩短URL?我正在使用PHP进行编码。最初,我考虑编写一些以字符(例如“ a”)开头并遍历请求的内容,在数据库中创建记录,因此必须将字符递增到b,c,d … A,B等。适当。
但是我突然意识到,该算法可能很笨拙,并且可能有更好的方法来实现。
我在Google上读了一些书,有些人似乎是通过数据库ID列中的基本转换来实现的。这不是我太熟悉的东西。
有人可以向我解释一下这将如何工作吗?几个代码示例也很棒。
我显然不想要一个完整的解决方案,因为我想亲自学习,但是仅提供有关此操作方式的解释/伪代码将是极好的。
大多数缩短服务仅使用一个计数器,该计数器随每个条目递增,并将基数从10转换为64。
PHP中的实现可能如下所示:
function encode($number) { return strtr(rtrim(base64_encode(pack('i', $number)), '='), '+/', '-_'); } function decode($base64) { $number = unpack('i', base64_decode(str_pad(strtr($base64, '-_', '+/'), strlen($base64) % 4, '='))); return $number[1]; } $number = mt_rand(0, PHP_INT_MAX); var_dump(decode(encode($number)) === $number);
所述encode函数接受的整数,将其转换成字节(pack),与基地-64编码(编码它base64_encode),修剪拖尾填充=(rtrim),并替换字符+和/由-和_分别(strtr)。该decode函数是encode与之相反的函数,并且功能完全相反(除了添加尾随填充)。
encode
pack
base64_encode
=
rtrim
+
/
-
_
strtr
decode
的其他用途strtr是将原始Base-64字母转换为URL和文件名安全字母,+并且/需要使用百分比编码进行编码。