php 短链接算法收集与分析


Posted in PHP onDecember 30, 2011

短链接就不说了,大家已经都清楚了,如下所示就是短链接:
新浪微博 http://t.cn/SVpONM
腾讯微博 http://url.cn/302yor
Yun.io http://d.yun.io/PNri2v
短链接的好处:1、内容需要;2、用户友好;3、便于管理。
如何实现呢,大概有三个步骤:
1、定义一个URL映射算法,可以将长的URL映射成短字符串;
2、使用一个存储(数据库?NoSQL?)来存储完成的映射;
3、实现自己的URL映射算法;
一般来说,第三步是我们比较头疼的,如何将一个长的URL字符串,映射成一个较短的字符串呢。我总结了三种办法:
普通实现
我想以前大家学习过十进制和二进制的互相转换,或者十进制和十六进制的互相转换,那么为了更短,我们可以使用62进制,对于一个数字ID进行转码,转换成一个短字符串。
这种做法的缺点是没有办法保证所有链接都是固定的位数的长度,而且在高并发的情况下,如何保证能够快速分发是个问题。
具体实现方法:

/** 
* 利用62进制对数字ID进行短链接编码,缺点不能保证每个短链接是固定长度 
* 
* @author wanshiqiang<wangshiqiang@360.cn> 
* @param integer $integer 
* @param string $base 
*/ 
private function getShortenedURLFromID ($integer, $base = ALLOWED_CHARS) 
{ 
$length = strlen($base); 
while($integer > $length - 1) 
{ 
$out = $base[fmod($integer, $length)] . $out; 
$integer = floor( $integer / $length ); 
} 
return $base[$integer] . $out; 
} 
/** 
* 对62进制编码的短链接进行解码 
* 
* @author wangshiqiang<wangshiqiang@360.cn> 
* @param string $string 
* @param string $base 
*/ 
private function getIDFromShortenedURL ($string, $base = ALLOWED_CHARS) 
{ 
$length = strlen($base); 
$size = strlen($string) - 1; 
$string = str_split($string); 
$out = strpos($base, array_pop($string)); 
foreach($string as $i => $char) 
{ 
$out += strpos($base, $char) * pow($length, $size - $i); 
} 
return $out; 
}

文艺实现
算法描述:使用6个字符来表示短链接,我们使用ASCII字符中的'a'-'z','0'-'5',共计32个字符做为集合。每个字符有32种状态,六个字符就可以表示32^6(1073741824),那么如何得到这六个字符,描述如下:
对传入的长URL进行Md5,得到一个32位的字符串,这个字符串变化很多,是16的32次方,基本上可以保证唯一性。将这32位分成四份,每一份8个字符,这时机率变成了16的8次方,是4294967296,这个数字碰撞的机率也比较小啦,关键是后面的一次处理。我们将这个8位的字符认为是16进制整数,也就是1*('0x'.$val),然后取0-30位,每5个一组,算出他的整数值,然后映射到我们准备的32个字符中,最后就能够得到一个6位的短链接地址。
PHP实现如下:
function shorten( $long_url ) 
{ 
$base32 = "abcdefghijklmnopqrstuvwxyz012345"; 
$hex = md5( $long_url ); 
$hexLen = strlen( $hex ); 
$subHexLen = $hexLen / 8; 
$output = array(); 
for( $i = 0; $i < $subHexLen; $i++ ) 
{ 
$subHex = substr( $hex, $i * 8, 8 ); 
$subHex = 0x3FFFFFFF & ( 1 * ('0x' . $subHex ) ); 
  $out = ''; 
for( $j = 0; $j < 6; $j++ ) 
{ 
$val = 0x0000001F & $int; 
$out .= $base32[$val]; 
$int = $int >> 5; 
} 
$output[] = $out; 
} 
return $output; 
}

二逼实现
下面这个函数使用了纯随机的方式来生成一个短链接,虽然我们可以通过查询操作来确保不重复使用短链接,可是... 这样真的靠谱吗~~
function random($length, $pool = '') { 
$random = ''; 
if (empty($pool)) { $pool = 'abcdefghkmnpqrstuvwxyz'; $pool .= 
'23456789'; } 
srand ((double)microtime()*1000000); 
for($i = 0; $i < $length; $i++) { $random .= 
substr($pool,(rand()%(strlen ($pool))), 1); } 
return $random; 
}

Technorati 标签: 短链接,Short Url,映射,哈希

参考资料:

1、微博短地址原理解析

2、微博短域名原理及作用

3、Yours.org

4、Free PHP URL Shorten script that kicks ass

5、PHP Short Url Algorithm Implementation

6、Implement your own short URL

7、短网址算法初步汇总

8、Short Url 实现方式

PHP 相关文章推荐
同台服务器使用缓存APC效率高于Memcached的演示代码
Feb 16 PHP
PHP 导出数据到淘宝助手CSV的方法分享
Feb 27 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
Nov 02 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
Oct 03 PHP
PHP Global变量定义当前页面的全局变量实现探讨
Jun 05 PHP
使用淘宝IP库获取用户ip地理位置
Oct 27 PHP
使用PHP备份MYSQL数据的多种方法
Jan 15 PHP
Laravel框架中实现使用阿里云ACE缓存服务
Feb 10 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
PHP操作Redis常用命令的实例详解
Dec 23 PHP
php的大小写敏感问题整理
Dec 29 #PHP
php读取mysql乱码,用set names XXX解决的原理分享
Dec 29 #PHP
php站内搜索并高亮显示关键字的实现代码
Dec 29 #PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 #PHP
PHP防CC攻击实现代码
Dec 29 #PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 #PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
Dec 28 #PHP
You might like
2021年最新CPU天梯图
2021/03/04 数码科技
如何过滤高亮显示非法字符
2006/10/09 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
简单谈谈json跨域
2016/03/13 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
Python编写一个闹钟功能
2017/07/11 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
pandas的qcut()方法详解
2019/07/06 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
python线程中的同步问题及解决方法
2019/08/29 Python
详解Python time库的使用
2019/10/10 Python
Python @property装饰器原理解析
2020/01/22 Python
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS