热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php短连接解析,php短链接算法收集与分析

短链接就不说了,大家已经都清楚了,如下所示就是短链接:新浪微博http:t.cnSVpONM腾讯微博http:url.cn302yorYu

短链接就不说了,大家已经都清楚了,如下所示就是短链接:

新浪微博 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

* @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

* @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 &#61; 0; $i <$subHexLen; $i&#43;&#43; )

{

$subHex &#61; substr( $hex, $i * 8, 8 );

$subHex &#61; 0x3FFFFFFF & ( 1 * (&#39;0x&#39; . $subHex ) );

$out &#61; &#39;&#39;;

for( $j &#61; 0; $j <6; $j&#43;&#43; )

{

$val &#61; 0x0000001F & $int;

$out .&#61; $base32[$val];

$int &#61; $int >> 5;

}

$output[] &#61; $out;

}

return $output;

}

二逼实现

下面这个函数使用了纯随机的方式来生成一个短链接&#xff0c;虽然我们可以通过查询操作来确保不重复使用短链接&#xff0c;可是... 这样真的靠谱吗~~

function random($length, $pool &#61; &#39;&#39;) {

$random &#61; &#39;&#39;;

if (empty($pool)) { $pool &#61; &#39;abcdefghkmnpqrstuvwxyz&#39;; $pool .&#61;

&#39;23456789&#39;; }

srand ((double)microtime()*1000000);

for($i &#61; 0; $i <$length; $i&#43;&#43;) { $random .&#61;

substr($pool,(rand()%(strlen ($pool))), 1); }

return $random;

}

Technorati 标签: 短链接,Short Url,映射,哈希

参考资料&#xff1a;



推荐阅读
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文详细解析了MySQL中常见的几种错误,并提供了具体的解决方法,帮助开发者快速定位和解决问题。 ... [详细]
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • TCP协议中的可靠传输机制分析
    本文深入探讨了TCP协议如何通过滑动窗口和超时重传来确保数据传输的可靠性,同时介绍了流量控制和拥塞控制的基本原理及其在实际网络通信中的应用。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 本题要求实现一个名为fun的函数,该函数的功能是从给定的字符串s中移除所有ASCII码为偶数值的字符,并将剩下的字符组成的新字符串存储在由t指向的数组中。 ... [详细]
  • 为何Serverless将成为未来十年的主导技术领域?
    为何Serverless将成为未来十年的主导技术领域? ... [详细]
author-avatar
yema狂想曲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有