微博短链接算法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 程式大小
Dec 06 PHP
PHP EOT定界符的使用详解
Sep 30 PHP
一个PHP数组应该有多大的分析
Jul 30 PHP
php性能优化分析工具XDebug 大型网站调试工具
May 22 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
Feb 28 PHP
php设计模式之观察者模式的应用详解
May 21 PHP
php预定义变量使用帮助(带实例)
Oct 30 PHP
php 在字符串指定位置插入新字符的简单实现
Jun 28 PHP
php实现微信扫码自动登陆与注册功能
Sep 22 PHP
php图形jpgraph操作实例分析
Feb 22 PHP
php常用的工具开发整理
Sep 26 PHP
php中get_object_vars()在数组的实例用法
Feb 22 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
smarty模板引擎之内建函数用法
2015/03/30 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
JavaScript加密解密7种方法总结分析
2007/10/07 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
node.js基础知识小结
2018/02/26 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
Python使用turtule画五角星的方法
2015/07/09 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
python程序输出无内容的解决方式
2020/04/09 Python
详解Python 循环嵌套
2020/07/09 Python
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
财务副总经理工作职责
2013/11/25 职场文书
写字楼租赁意向书
2014/07/30 职场文书
老乡聚会通知
2015/04/23 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
Python中for后接else的语法使用
2021/05/18 Python
Nebula Graph解决风控业务实践
2022/03/31 MySQL
Java实现字符串转为驼峰格式的方法详解
2022/07/07 Java/Android