php – Base10到base64 url缩短
作者:互联网
我正在编写一个url shortener函数用于我正在学习php的项目,这里是代码(顺便说一下,我认为全局这里不是一件好事:P):
$alphabet = array(1 => "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",
"0","1","2","3","4","5","6","7","8","9","_","-");
function shorten($id){
global $alphabet;
$shortenedId = "";
while($id>0){
$remainder = $id % 64;
$id = $id / 64;
$shortenedId = $alphabet[$remainder].$shortenedId;
}
return $shortenedId;
}
代码取自this Wikipedia article并适用于php.我的问题是,当我将64的倍数传递给函数时,我得到了一个错误的(为了我的目的)结果,例如128返回b不正确,它应该是aaa,但对于3位数来说太长了数.
此外,我开始认为这段代码有问题,如果我传递1’000’000’000’000作为$id我得到nItOq …我觉得这是错的,因为像bit.ly这样的网址缩短服务返回如果我使用它,我会认为这个算法优于他们的算法.
那么,有两个问题:
>你发现上面代码中的任何错误?
>如何管理64个多重ID?我是否必须忽略它们并转到下一个?
解决方法:
只需要几个小的调整,主要的两个是使字母表为零索引而不是一个索引,并在分割之前从id中减去余数
function shorten($id)
{
$alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';
$shortenedId = '';
while($id>0) {
$remainder = $id % 64;
$id = ($id-$remainder) / 64;
$shortenedId = $alphabet{$remainder} . $shortenedId;
};
return $shortenedId;
}
这是一个进一步修改过的版本…我很喜欢
function shorten($id, $alphabet='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-')
{
$base = strlen($alphabet);
$short = '';
while($id) {
$id = ($id-($r=$id%$base))/$base;
$short = $alphabet{$r} . $short;
};
return $short;
}
编辑:排序串联与OP相同
标签:php,url-shortener 来源: https://codeday.me/bug/20191006/1862935.html