PHP URL缩短算法

PHP URL缩短算法,php,algorithm,url,url-shortener,Php,Algorithm,Url,Url Shortener,有谁能推荐一种用于URL缩短的首选算法吗?我正在使用PHP编写代码。起初,我想写一些从字符开始的东西,比如“a”,然后遍历请求,在数据库中创建记录,因此必须将字符增加到b、c、d。。。A、 B等等 然而,我突然意识到,这个算法可能相当繁重/笨拙,可能有更好的方法来实现它 我在Google上读了一些文章,有些人似乎是通过数据库ID列的基转换来实现的。这件事我不太熟悉 有人能详细解释一下这是怎么回事吗?两个代码示例也很好 很明显,我不想要一个完整的解决方案,因为我想通过自己来学习,但是只要一个关于如

有谁能推荐一种用于URL缩短的首选算法吗?我正在使用PHP编写代码。起初,我想写一些从字符开始的东西,比如“a”,然后遍历请求,在数据库中创建记录,因此必须将字符增加到b、c、d。。。A、 B等等

然而,我突然意识到,这个算法可能相当繁重/笨拙,可能有更好的方法来实现它

我在Google上读了一些文章,有些人似乎是通过数据库ID列的基转换来实现的。这件事我不太熟悉

有人能详细解释一下这是怎么回事吗?两个代码示例也很好


很明显,我不想要一个完整的解决方案,因为我想通过自己来学习,但是只要一个关于如何工作的解释/伪代码就好了。

假设您的主键是INT,并且它会自动递增,下面的代码将让您开始=)



编辑:包括HGF答案中的基础转换。我忘了在原始帖子中使用base\u convert。

您可以使用base\u convert函数使用数据库ID将基数从10转换为36

<?php
   $id = 315;
   echo base_convert($id, 10, 36), "\n";
?>

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


我曾使用类似于如何从十进制转换为十六进制的算法来中断ID,但它将使用62个字符,而不是十六进制将使用的16个字符

'0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
示例:如果您要更改ID=1234567890,您将获得kv7yl1作为a键。

我采用了“轻”解决方案。根据用户请求,我使用此python snipplet生成一个唯一标识符(检查数据库中的冲突):

url_hash = base64.b64encode(os.urandom(int(math.ceil(0.75*7))))[:6]

并将其存储在数据库中

大多数缩短服务只使用一个计数器,该计数器随每个条目递增,并将基数从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
函数获取一个整数,将其转换为字节(),使用Base-64编码()对其进行编码,修剪尾部填充
=
(),并分别用
-
替换字符
+
)。
decode
函数与
encode
函数相反,其作用正好相反(除了添加尾随填充)


strtr
的另一个用途是将转换为as
+
/
需要使用百分比编码。

本机PHP base_convert()适用于小范围的数字,但如果确实需要对大值进行编码,考虑使用类似于这里提供的实现,如果您只为编码提供更多的合法字符,那么它将工作在64和更高的基础上。

在这里尝试以下方法:

hash_hmac('joaat', "http://www.example.com/long/url/", "secretkey");

它将为您提供适合专业url缩短器的哈希值,例如:“142ecd53

非常感谢。我可以理解这一点,但如果您只使用数据库ID,那么您将被限制为0-9个数字,所以只有Base10?以某种方式使用a-zA-Z0-9不是更好吗?或者我有一个非常美丽的时刻…谢谢你的建议!我现在有很多事情要做。我将与Base64进行一场比赛。非常感谢。
hash_hmac('joaat', "http://www.example.com/long/url/", "secretkey");