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

标签 php algorithm

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

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

但这总是生成固定长度的代码(在本例中为 5)。

万一数据库中有大量的URL受不了这里的五个符号怎么办?

抱歉英语不好。

最佳答案

您将不得不存储 URL,所以只需要一个表:

  • 网址:id, url

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

我的建议是将 ID 与基数 62(10 位数字、26 个大写字母、26 个小写字母 = 62)或可能为 64(添加 _ 和 -)相互转换。

我的意思是 1234 实际上是:

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

并且有一个相当简单的算法可以将数字转换为以 10 为底的形式。所以一个 base 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;
}

from10() 将 1234 转换为“qJ”(希望如此),to10() 将“qJ”转换为 1234,除非我的数学不对。

数字实际上是以相反的顺序存储的(相当于“一百二十三”写成“321”)因为这样更容易处理而且数字不需要以任何特定顺序排列.

关于php - 在 PHP 中为 URL 缩短服务生成代码的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2293389/

相关文章:

php - 在我的最后一个表行中选择不同的值

javascript - 如何使用 PHP 从服务器文件夹中检索文件并使用 javascript 在网页上显示/下载它?

php - 修复多维 foo[a][][b] 数组输入

iphone - 用于创建动态运动的算法资源

查找覆盖二维数组中某些元素的最小矩形数的算法

algorithm - 查找最近和最近的帖子,限制 20

php - 苹果推送通知与PHP脚本

php - 为什么我的服务器将添加值视为mysql_query中的identifier_link?

algorithm - 比较二进制堆的插入操作

c++ - 如何将string中的每个字符都改成 'n'在前面?