PHP URL缩短算法

Geo*_*rge 11 php algorithm url url-shortener

任何人都可以推荐一个首选算法用于URL缩短?我正在使用PHP进行编码.最初我想过写一些东西,从一个字符开始,如"a",并迭代请求,在数据库中创建记录,因此必须将字符增加到b,c,d ...... A,B等等适当.

然而,我突然意识到这个算法可能非常沉重/笨拙,可能有更好的方法.

我在Google上阅读了一些内容,有些人似乎是通过数据库的ID列进行基本转换.这不是我太熟悉的事情.

有人可以详细说明并告诉我这是如何工作的吗?一些代码示例也很棒.

我显然不想要一个完整的解决方案,因为我想通过自己动手学习,但只是一个关于如何工作的解释/伪代码将是非常好的.

Gum*_*mbo 14

大多数缩短服务只使用一个计数器,该计数器随每个条目递增,并将基数从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);
Run Code Online (Sandbox Code Playgroud)

所述encode函数接受的整数,将其转换成字节(pack),与基地-64编码(编码它base64_encode),修剪拖尾填充=(rtrim),并替换字符+/-_分别(strtr).该decode函数是反函数,encode并且完全相反(除了添加尾部填充之外).

额外使用的strtr是将原始Base-64字母表转换为URL和文件名安全字母表,+并且/需要使用Percentage-encoding进行编码.


hgf*_*hgf 5

您可以使用 base_convert 函数使用数据库 ID 进行从 10 到 36 的基数转换。

<?php
   $id = 315;
   echo base_convert($id, 10, 36), "\n";
?>
Run Code Online (Sandbox Code Playgroud)

或者您可以重复使用以下页面评论中提出的一些想法:

http://php.net/manual/en/function.base-convert.php