了解网址缩短功能

时间:2011-10-07 23:30:41

标签: php mysql math base64

我想更好地理解函数的工作原理。我不熟悉下面的功能如何工作,我正在寻找一些帮助,可能还有一个解释。除了使用数学函数(如floor())的一部分外,我得到了大部分内容。让我困惑的部分是do ... while循环。如何使用$ id,floor()和$ base将长网址转换为短网址?另外,它究竟是什么迭代你需要做什么... 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

获得了这个功能

2 个答案:

答案 0 :(得分:1)

您可能只习惯于考虑其中包含0到9的数字。如果我们有12个手指而不是10个手指会发生什么?也许我们会超过9?

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

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

如果要访问URL,请转换回基准10,在数据库中查找,然后将其提供给用户。

答案 1 :(得分:0)

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

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