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