在PHP中为URL缩短服务生成代码的最佳方法是什么?

时间:2010-02-19 00:53:58

标签: php algorithm

我必须使用这种方式为URL缩短服务生成代码

  $code = substr(md5(uniqid(rand(), 1)), 3, 5);

但这始终生成一个固定长度的代码(在这种情况下为5)。

如果数据库中有大量的URL无法忍受这五个符号怎么办?

抱歉英语不好。

1 个答案:

答案 0 :(得分:8)

您将需要存储URL,因此只需要一个表:

  • 网址:id,网址

其中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”),因为这更容易处理,并且数字不需要按任何特定的顺序排列