了解url缩短功能


Understanding a url shortener function

我试图更好地理解一个函数是如何工作的。我不熟悉下面的功能是如何工作的,我正在寻找一些帮助和可能的解释。除了使用floor()等数学函数的一部分外,我得到了大部分。最让我困惑的部分是……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位数字(称为"base 10")转换为64位数字。

当您想要访问一个URL时,您需要将其转换回10进制,在数据库中查找,然后将其返回给用户。

这只是base64的自定义实现(或多或少)。它只使用$chars的字符集,所以它没有/+ s。

输入一个大整数。循环继续将其分成62的倍数,并从$chars集合中选择相应的字母/数字。