思路:

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://www.jb51.net/');

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

$url = 'https://www.jb51.net/?id='.$i;

$shorta = shorturl($url);

$short = $shorta[0];

if(in_array($short, $result)){

$repeats[] = $short;

}

$result[] = $short;

}

$result = array();

for($i=0;$i

$url = 'https://www.jb51.net/?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://www.jb51.net/?id=1640"

[1] =>

string(27) "https://www.jb51.net/?id=18661"

}

'fMneYf' =>

array(2) {

[0] =>

string(26) "https://www.jb51.net/?id=2072"

[1] =>

string(26) "https://www.jb51.net/?id=8480"

}

'3eQBzq' =>

array(2) {

[0] =>

string(26) "https://www.jb51.net/?id=4145"

[1] =>

string(26) "https://www.jb51.net/?id=4273"

}

'j2mmuy' =>

array(2) {

[0] =>

string(26) "https://www.jb51.net/?id=7131"

[1] =>

string(27) "https://www.jb51.net/?id=17898"

}

'qEZbIv' =>

array(2) {

[0] =>

string(26) "https://www.jb51.net/?id=7320"

[1] =>

string(26) "https://www.jb51.net/?id=8134"

}

'uQFnay' =>

array(2) {

[0] =>

string(26) "https://www.jb51.net/?id=7347"

[1] =>

string(26) "https://www.jb51.net/?id=7962"

}

'FJj6Fr' =>

array(2) {

[0] =>

string(26) "https://www.jb51.net/?id=8628"

[1] =>

string(26) "https://www.jb51.net/?id=9031"

}

'3Eviym' =>

array(2) {

[0] =>

string(27) "https://www.jb51.net/?id=11175"

[1] =>

string(27) "https://www.jb51.net/?id=14437"

}

}

php短连接解析,微博短链接算法php版本实现代码相关推荐

  1. php 短网址 算法,微博短链接算法PHP版本_php

    思路: 1)将长网址md5生成32位签名串,分为4段, 每段8个字节; 2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理; 3 ...

  2. java 短连接+MD5加密短链接

    java 短连接+MD5加密短链接 import java.security.MessageDigest; public class ShotUrlUtil { public static void ...

  3. 微博java实现原理_【转】URL短地址压缩算法 微博短地址原理解析 (Java实现)...

    最近,项目中需要用到短网址(ShortUrl)的算法,于是在网上搜索一番,发现有C#的算法,有.Net的算法,有PHP的算法,就是没有找到Java版的短网址(ShortUrl)的算法,很是郁闷.同时还 ...

  4. 什么是长连接和短连接?(长链接、短链接)什么时候使用长连接、短链接?

    文章目录 什么是长连接和短连接? 什么时候使用长连接.短链接? 定义 适用场景 什么是长连接和短连接? 在HTTP/1.0中默认使用短连接.也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连 ...

  5. php版本算法,微博短链接算法PHP版本

    )将长网址md 生成 位签名串 分为 段 每段 个字节 )对这四段循环处理 取 个字节 将他看成 进制串与 x fffffff( 位 )与操作 即超过 位的忽略处理 )这 位分成 段 每 位的数字作为 ...

  6. java url压缩_URL短地址压缩算法 微博短地址原理解析 (Java实现)

    最近,项目中需要用到短网址(ShortUrl)的算法,于是在网上搜索一番,发现有C#的算法,有.Net的算法,有PHP的算法,就是没有找到Java版的短网址(ShortUrl)的算法,很是郁闷.同时还 ...

  7. java 短地址_URL短地址压缩算法 微博短地址原理解析(再转与Java实现) | 学步园

    主要是一次发新浪微博,发网址时看到网址被压缩了,才对这个有兴趣,于是查了查,查到这些 和其Java实现的博文 对第一篇博文,留了疑问,主要是觉得于四个得到的压缩地址中取一个,那之前循环计算不是有些浪费 ...

  8. 微博短网址 php,php生成短网址 仿微博短网址生成代码

    1,html代码部分 复制代码 代码示例: urlShort-php生成短网址_www.jbxue.com_脚本学堂提供 2,生成php短网址的代码. 复制代码 代码示例: header(" ...

  9. HTTP长链接与短连接?

    目录 前言 1. 长链接是什么? RST包是什么? 2. 长链接的过期时间 3.长连接的数据传输完成识别 4.TCP通道复用(长连接)并发连接数的数量限制 5.容易混淆的概念--TCP的keep al ...

最新文章

  1. 服务器安全设置之--硬盘权限篇
  2. MySQL主主(双主)数据同步
  3. 【自动化测试】搭建一个简单从Excel读取用例内容并输出结果的脚本
  4. oracle中year类型吗,为什么表名this_year_end+next_year在Oracle数据库中无效?()
  5. 实战 SSH 端口转发
  6. PHP实现多文件上传
  7. 简说设计模式——策略模式
  8. 【Sentry】Sentry安装
  9. Webpack3 从入门到放弃
  10. Python风格总结:日期操作
  11. 当PowerDesigner的工具栏不见时候该怎么调出来
  12. Manecher算法
  13. GB35114---SM3withSM2证书生成及读取(二)
  14. 随机微分方程学习笔记04 Ito公式
  15. CCF关于举办CSP-J1 CSP-S1 初赛的报名通知
  16. 8个常见的研究者认知偏误陷阱(转载)
  17. AD7606的国产替代方案—ADCS8162
  18. 超全面!如何系统学习功能图标
  19. Soundiron Bontastic Vintage Italian Chord Organ 复古意大利和弦风琴
  20. Python爬虫学习笔记_DAY_3_Python类型查询与类型转换【Python爬虫】

热门文章

  1. python实现岭回归_python机器学习:岭回归介绍
  2. Binder系列1 Binder总体设计思想
  3. 类似直播飘星动画效果
  4. 有什么好玩的游戏推荐吗
  5. 小幺鸡接口管理本地部署
  6. JavaScript设计模式-工厂模式
  7. Flutter组件--TextField使用详情
  8. iOS学习笔记(5)— UITextField
  9. mapper中mysql复合语句_MyBatis定义复合主键
  10. 架构师之路--让代码和血液相融!!