php - 短网址的生成原理是什么?
PHP中文网
PHP中文网 2017-04-11 09:55:17
[PHP讨论组]

我GitHub上的项目链接变成了这么短
http://suo.im/zlqlb

PHP中文网
PHP中文网

认证0级讲师

全部回复(4)
PHP中文网

0-9 a-z A-Z 你看看主流的短连接是几位的 每一位随机取 基本不会重复 保险起见数据库查一遍是否重复,然后key和url存入数据库,前期量小的话 很简单 直接根据key取url然后重定向,后期访问压力大了,基本就是读压力,前端档一个缓存就好了

ringa_lee

短网址的发展历史其实不长,他的出现主要是基于微博(如新浪微博,http://t.cn,http://url.cn)、短博客、移动营销的崛起而发展起来的。在这些环境中,过长的网址使得用户视觉体验度极差,所以有必要将很长的网址进行缩短。那么短网址缩短的原理是什么呢?


短网址的工作原理主要有两种形式:

  1. 将原网址通过MD5转化成一串小字母,这种方法简单,但是这种算法是不可逆的,所以别想着直接反转短地址,如果你想深入了解这种算法,可以百度“MD5”+”短网址”

  2. 数据库类型的存储式,通过给每个长网址自动分配IDCODE来实现网址的转换,然后当用户访问时,通过查询数据里面IDCODE对应的原网址,实现实时跳转。这种方式是可逆的,而且便于管理和统计,目前主流的短网址程序都是应用的这种方式,如:phurlyourl等。


php短地址的算法:

function get_last_number() {
     $db_result = mysql_query("SELECT last_number FROM ".DB_PREFIX."settings") or db_die(__FILE__, __LINE__, mysql_error());
     $db_row = mysql_fetch_row($db_result);

     return $db_row[0];
}

function increase_last_number() {
     mysql_query("UPDATE ".DB_PREFIX."settings SET last_number = (last_number + 1)") or db_die(__FILE__, __LINE__, mysql_error());

    return (mysql_affected_rows() > 0) ? true : false;
}

function generate_code($number) {
    $out = "";
    $codes = "abcdefghjkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ";

    while ($number > 53) {
      $key = $number % 54;
      $number = floor($number / 54) - 1;
      $out = $codes{$key}.$out;
 }

    return $codes{$number}.$out;
}

function insert_url($url, $code) {
    mysql_query("INSERT INTO ".DB_PREFIX."urls (url, code, date_added) VALUES ('$url', '$code', NOW()") or db_die(__FILE__, __LINE__, mysql_error());

    return mysql_insert_id();
}

原理就是给每一个过来的长地址,发一个号即可,小型系统直接用mysql的自增索引就搞定了。如果是大型应用,可以考虑各种分布式key-value系统做发号器。不停的自增就行了。

第一个使用这个服务的人得到的短地址是http://xx.xx/0

第二个是 http://xx.xx/1 第11个是 http://xx.xx/a 第依次往后,相当于实现了一个62进制的自增字段即可。

PHP中文网

原理?数据库而已
数据库结构

token    url
  • token 短连接token,5个长度字符可以容纳(52个大小写字母+10个数字)5次方=916132832

  • url 原始链接

PHPz

你的是GitHub的把长连接缩短成短链接,下面是网址:
https://git.io/

常用的缩短网址有:
Google:https://goo.gl/
bitly: https://bitly.com/

上面答非所问,改正下,不知道你有没有发现:

就是短链接定向到你的长链接去了,而长短链接的对应关系一般是会存储到库因为很难有算法能做到长短链接一一对应,所以一般是存储到mongodb以及缓存吧

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号