微博短链接算法php版本实现代码


Posted in PHP onSeptember 15, 2012

思路:
1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;
下面是PHP代码:

function shorturl($url='', $prefix='', $suffix='') { 
$base = array ( 
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 
'y', 'z', '0', '1', '2', '3', '4', '5'); 
$hex = md5($prefix.$url.$suffix); 
$hexLen = strlen($hex); 
$subHexLen = $hexLen / 8; 
$output = array(); 
for ($i = 0; $i < $subHexLen; $i++) { 
$subHex = substr ($hex, $i * 8, 8); 
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex)); 
$out = ''; 
for ($j = 0; $j < 6; $j++) { 
$val = 0x0000001F & $int; 
$out .= $base[$val]; 
$int = $int >> 5; 
} 
$output[] = $out; 
} 
return $output; 
} 
$urls = shorturl('https://3water.com/'); 
var_dump($urls);

结果
array(4) { 
[0]=> 
string(6) "alms1l" 
[1]=> 
string(6) "2ipmby" 
[2]=> 
string(6) "avo1hu" 
[3]=> 
string(6) "fdlban" 
}

另外一个版本:
function shorturl($url='', $prefix='', $suffix='') { 
$base = array( 
"a","b","c","d","e","f","g","h", 
"i","j","k","l","m","n","o","p", 
"q","r","s","t","u","v","w","x", 
"y","z","0","1","2","3","4","5", 
"6","7","8","9","A","B","C","D", 
"E","F","G","H","I","J","K","L", 
"M","N","O","P","Q","R","S","T", 
"U","V","W","X","Y","Z"); 
$hex = md5($prefix.$url.$suffix); 
$hexLen = strlen($hex); 
$subHexLen = $hexLen / 8; 
$output = array(); 
for ($i = 0; $i < $subHexLen; $i++) { 
$subHex = substr ($hex, $i * 8, 8); 
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex)); 
$out = ''; 
for ($j = 0; $j < 6; $j++) { 
$val = 0x0000003D & $int; 
$out .= $base[$val]; 
$int = $int >> 5; 
} 
$output[] = $out; 
} 
return $output; 
}

结果:
array(4) { 
[0] => 
string(6) "6jmMVj" 
[1] => 
string(6) "2EnIby" 
[2] => 
string(6) "6vIVfu" 
[3] => 
string(6) "B7Fb6n" 
}

但是升级版本碰撞率反而更高了,不知道为什么。
测试碰撞的测试代码:
$result = array(); 
$repeats= array(); 
$loop = 20000; 
for($i=0;$i<$loop;$i++){ 
$url = 'https://3water.com/?id='.$i; 
$shorta = shorturl($url); 
$short = $shorta[0]; 
if(in_array($short, $result)){ 
$repeats[] = $short; 
} 
$result[] = $short; 
} 
$result = array(); 
for($i=0;$i<$loop;$i++){ 
$url = 'https://3water.com/?id='.$i; 
$shorta = shorturl($url); 
$short = $shorta[0]; 
if(in_array($short, $repeats)){ 
$result[$short][] = $url; 
} 
} 
var_dump($repeats); 
var_dump($result);

结果:
array(8) { 
[0] => 
string(6) "3eQBzq" 
[1] => 
string(6) "uQFnay" 
[2] => 
string(6) "qEZbIv" 
[3] => 
string(6) "fMneYf" 
[4] => 
string(6) "FJj6Fr" 
[5] => 
string(6) "3Eviym" 
[6] => 
string(6) "j2mmuy" 
[7] => 
string(6) "jyQfIv" 
} 
array(8) { 
'jyQfIv' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=1640" 
[1] => 
string(27) "https://3water.com/?id=18661" 
} 
'fMneYf' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=2072" 
[1] => 
string(26) "https://3water.com/?id=8480" 
} 
'3eQBzq' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=4145" 
[1] => 
string(26) "https://3water.com/?id=4273" 
} 
'j2mmuy' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=7131" 
[1] => 
string(27) "https://3water.com/?id=17898" 
} 
'qEZbIv' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=7320" 
[1] => 
string(26) "https://3water.com/?id=8134" 
} 
'uQFnay' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=7347" 
[1] => 
string(26) "https://3water.com/?id=7962" 
} 
'FJj6Fr' => 
array(2) { 
[0] => 
string(26) "https://3water.com/?id=8628" 
[1] => 
string(26) "https://3water.com/?id=9031" 
} 
'3Eviym' => 
array(2) { 
[0] => 
string(27) "https://3water.com/?id=11175" 
[1] => 
string(27) "https://3water.com/?id=14437" 
} 
}
PHP 相关文章推荐
PHP的历史和优缺点
Oct 09 PHP
PHP 应用程序的安全 -- 不能违反的四条安全规则
Nov 26 PHP
PHP MVC模式在网站架构中的实现分析
Mar 04 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
PHP实现对文本数据库的常用操作方法实例演示
Jul 04 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
php获取今日开始时间和结束时间的方法
Feb 27 PHP
Yii2实现自定义独立验证器的方法
May 05 PHP
详解php中serialize()和unserialize()函数
Jul 08 PHP
php使用array_chunk函数将一个数组分割成多个数组
Dec 05 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 PHP
PHP实现文件上传与下载
Aug 28 PHP
PHP优于Node.js的五大理由分享
Sep 15 #PHP
PHP的autoload机制的实现解析
Sep 15 #PHP
PHP中数组合并的两种方法及区别介绍
Sep 14 #PHP
PHP合并两个数组的两种方式的异同
Sep 14 #PHP
PHP数据流应用的一个简单实例
Sep 14 #PHP
分享一下贝贝成长进度的php代码
Sep 14 #PHP
PHP 之Section与Cookie使用总结
Sep 14 #PHP
You might like
关于PHP5 Session生命周期介绍
2010/03/02 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
Vue如何提升首屏加载速度实例解析
2020/06/25 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
将字典转换为DataFrame并进行频次统计的方法
2018/04/08 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
Canvas获取视频第一帧缩略图的实现
2020/11/11 HTML / CSS
美国庭院家具购物网站:AlphaMarts
2019/04/10 全球购物
美发活动策划书
2014/01/14 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
运动会广播稿100字
2015/08/19 职场文书
Python学习之os包使用教程详解
2022/03/21 Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
2022/04/08 Python
KVM基础命令详解
2022/04/30 Servers