php - 了解 url 缩短函数

标签 php mysql math base64

我试图更好地理解函数是如何工作的。我不熟悉下面的函数是如何工作的,我正在寻找一些帮助和可能的解释。我得到了其中的大部分内容,除了使用诸如 Floor() 之类的数学函数的部分。最让我困惑的部分是 do...while 循环。使用 $id、floor() 和 $base 究竟如何将长 url 转换为短 url?另外,它到底在需要 do...while 循环的地方迭代什么?

$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$base  = strlen($chars);     // base 62
$site  = 'http://short.co';  // Replace with your domain

// ...Connect to MySQL server here...

function shorten_url($url)
{
  global $chars, $site, $base;

  $hash  = md5($url); 
  $alnum = NULL; //

  // Check if URL is already exist on db
  // Otherwise add this URL to table
  $res = mysql_query("SELECT id FROM urls WHERE url_hash='$hash'");

  if (mysql_num_rows($res)) {
    $row = mysql_fetch_object($res);
    $id = $row->id;
  } else {
    mysql_query("INSERT INTO urls (url, url_hash) VALUES ('$url', '$hash')");
    $id = mysql_insert_id();
  }

  // Convert id to base 62 and decode to alphanumeric
  do {
    $alnum = $chars[($id%$base)].$alnum;
  } while ($id = floor($id/$base));

  return "$site/$alnum";
}

如果有人可以在没有大量数学术语的情况下提供解释......我将不胜感激。谢谢。

我从 http://bsd-noobz.com/blog/how-to-create-url-shortening-service-using-simple-php 获取了该函数

最佳答案

您可能只习惯于思考包含 0 到 9 的数字。如果我们有 12 个手指而不是 10 个,会发生什么?也许我们会在 9 之外再加一个数字?

在您的代码中,您的数字系统中有 62 个不同的“数字”。您从“a”开始计数,然后是“b”,然后是“c”,依此类推。当你用完它们时,你开始使用两个数字 - “aa”,然后“ab”,直到你用完这些......然后添加另一个数字。

当您创建新的缩短的 URL 时,您将其插入数据库并获得一个“id”号。该函数将其从 10 位数字(称为“基数 10”)转换为 64 位数字。

当您想要访问 URL 时,您可以将其转换回基数 10,在数据库中查找它,然后将其返回给用户。

关于php - 了解 url 缩短函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7693780/

相关文章:

php - 无法写入新创建的文件

php - 用php显示耗时

php - 如何在从mysql数据库下载的csv中添加标题

MySQL根据字段内容连接

algorithm - 求解递归 T(n) = 2T(n/2) + n^4

php - html 页面上方的静态消息

php - 如何用PHP显示Unicode数据

mysql - 如何将其编写为 SQL 查询

math - 如何从相机校准数据绘制相机和图像位置?

math - 在做了几年程序员之后,我如何在数学上变得更好