Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中为URL缩短服务生成代码的最佳方法是什么?_Php_Algorithm - Fatal编程技术网

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

在PHP中为URL缩短服务生成代码的最佳方法是什么?,php,algorithm,Php,Algorithm,我必须使用这种方式为URL缩短服务生成代码 $code = substr(md5(uniqid(rand(), 1)), 3, 5); 但这总是需要生成一个固定长度的代码(在本例中为5) 如果数据库中有大量URL无法忍受此处的五个符号,该怎么办 很抱歉英文不好。您必须存储URL,因此只需创建一个表格即可: URL:id,URL 其中id是一个自动递增序列,url列被索引。这样,每个URL都是唯一的。最简单的方法是简单地使用ID,但您可以使用更短的ID 我的建议是将ID转换为基数62(1

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

  $code = substr(md5(uniqid(rand(), 1)), 3, 5);
但这总是需要生成一个固定长度的代码(在本例中为5)

如果数据库中有大量URL无法忍受此处的五个符号,该怎么办


很抱歉英文不好。

您必须存储URL,因此只需创建一个表格即可:

  • URL:id,URL
其中id是一个自动递增序列,url列被索引。这样,每个URL都是唯一的。最简单的方法是简单地使用ID,但您可以使用更短的ID

我的建议是将ID转换为基数62(10位数字,26个大写字母,26个小写字母=62)或64(添加u和-)

我的意思是1234实际上是:

1 x 103+2 x 102+3 x 101+4 x 100

有一个相当简单的算法,可以把一个数字从10进制形式变成10进制形式。因此,以62为基数的“数字”是:

1234(基数10)=19 x 621+56 x 620=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;
}
$digits=范围(0,9)+范围('A','Z')+范围('A','Z'))
函数from10($base10){
全球美元位数;
$ret='';
$nd=计数(位数);
$n=$nd;
而($base10>0){
$r=$base10%$n;
$ret.=$digits[$r];
$n=(int)($base10/$n);
$n*=nd$nd;
}
返回$ret;
}
函数到10($baseN){
全球美元位数;
$nd=计数(位数);
$ret=0;
$n=$nd;
对于($i=0;$i)