我必须使用这种方式为URL缩短服务生成代码
$code = substr(md5(uniqid(rand(), 1)), 3, 5);
但这始终生成一个固定长度的代码(在这种情况下为5)。
如果数据库中有大量的URL无法忍受这五个符号怎么办?
抱歉英语不好。答案 0 :(得分:8)
您将需要存储URL,因此只需要一个表:
其中id是自动递增序列,url列已编制索引。这样每个URL都是唯一的。最简单的方法是简单地使用ID,但你可以缩短它。
我的建议是将ID转换为基数62(10位数,26个大写字母,26个小写字母= 62)或可能64(添加_和 - )。
我的意思是1234真的是:
1 x 10 3 + 2 x 10 2 + 3 x 10 1 + 4 x 10 0
并且有一个相当简单的算法可以将数字转换为基数10形式。因此,基数62“数字”是:
1234(基数10)= 19 x 62 1 + 56 x 62 0 = Jq
如果我的数学是正确的。
以下功能可以满足您的需求。
$digits = range(0, 9) + range('A', 'Z') + range('a', 'z')
function from10($base10) {
global $digits;
$ret = '';
$nd = count($digits);
$n = $nd;
while ($base10 > 0) {
$r = $base10 % $n;
$ret .= $digits[$r];
$n = (int)($base10 / $n);
$n *= $nd;
}
return $ret;
}
function to10($baseN) {
global $digits;
$nd = count($digits);
$ret = 0;
$n = $nd;
for ($i=0; $i<strlen($baseN); $i++) {
$ret += $n * $baseN[$i];
$n *= $nd;
}
return $ret;
}
from10()
将1234转换为“qJ”(希望如此),to10()
将“qJ”转换为1234,除非我的数学已关闭。
数字实际上以相反的顺序存储(相当于“一百二十三”被写为“321”),因为这更容易处理,并且数字不需要按任何特定的顺序排列