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 相关文章推荐
PHP完整的日历类(CLASS)
Nov 27 PHP
php smarty函数扩展
Mar 15 PHP
让codeigniter与swfupload整合的最佳解决方案
Jun 12 PHP
destoon实现调用热门关键字的方法
Jul 15 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
Jan 28 PHP
PHP之预定义接口详解
Jul 29 PHP
PHP正则表达式之捕获组与非捕获组
Nov 06 PHP
php图片上传类 附调用方法
May 15 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
May 26 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
详解使用php-cs-fixer格式化代码
Sep 16 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
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
php中使用接口实现工厂设计模式的代码
2012/06/17 PHP
Expandable &quot;Detail&quot; Table Rows
2007/08/29 Javascript
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
JavaScript this调用规则说明
2010/03/08 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
js无刷新操作table的行和列
2014/03/27 Javascript
基于insertBefore制作简单的循环插空效果
2015/09/21 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
Vue3.0的优化总结
2020/10/16 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
Android分包MultiDex策略详解
2017/10/30 Python
替换python字典中的key值方法
2018/07/06 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
python中append函数用法讲解
2020/12/11 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
公司总经理岗位职责
2014/03/15 职场文书
小学生家长寄语
2014/04/02 职场文书
国际贸易求职信
2014/07/05 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
校车安全责任书
2014/08/25 职场文书
事业单位年度考核评语
2014/12/31 职场文书
房产公证书
2015/01/23 职场文书
2015年导购员工作总结
2015/04/25 职场文书
行政上诉状范文
2015/05/23 职场文书
Python竟然能剪辑视频
2021/05/25 Python
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript