我必须使用这种方式为URL缩短服务生成代码
$code = substr(md5(uniqid(rand(), 1)), 3, 5);
Run Code Online (Sandbox Code Playgroud)
但这始终生成一个固定长度的代码(在这种情况下为5).
如果数据库中有大量的URL无法忍受这五个符号怎么办?
抱歉英语不好.
你将不得不存储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×62 1 + 56×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;
}
Run Code Online (Sandbox Code Playgroud)
from10()将1234转换为"qJ"(希望如此)to10()并将"qJ"转换为1234,除非我的数学已关闭.
数字实际上以相反的顺序存储(相当于"一百二十三"被写为"321"),因为这更容易处理,并且不需要数字以任何特定顺序.