微博短链接算法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扩展图文教程
Dec 12 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
调整PHP的性能
Oct 30 PHP
php文件上传的例子及参数详解
Dec 12 PHP
php设置静态内容缓存时间的方法
Dec 01 PHP
Codeigniter框架实现获取分页数据和总条数的方法
Dec 05 PHP
PHP编程入门的基本语法知识点总结
Jan 26 PHP
PHP访问数据库集群的方法小结
Mar 14 PHP
php一个文件搞定微信jssdk配置
Dec 12 PHP
PHP生成随机数的方法总结
Mar 01 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
Apr 04 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
把77A收信机改造成收音机
2021/03/02 无线电
thinkPHP5.1框架路由::get、post请求简单用法示例
2019/05/06 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
js创建数据共享接口——简化框架之间相互传值
2011/10/23 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
2017/07/22 jQuery
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
Python全局变量操作详解
2015/04/14 Python
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
老生常谈Python基础之字符编码
2017/06/14 Python
numpy数组拼接简单示例
2017/12/15 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
scrapy-splash简单使用详解
2021/02/21 Python
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
幼儿园春游活动方案
2014/01/19 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
欢度春节标语
2014/07/01 职场文书
项目工作说明书
2014/07/29 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书