PHP实现网址短链接转换的方法

  •   
  • 5002
  • PHP
  • 8
  • super_dodo
  • 2016/08/16

最近需要做一个将原始链接转换成自己的短连接,这样可以方便的帮客户和用户进行对该链接的监控以及相关数据的统计功能等。现在很多大型的网站都提供有相应的网址短连接的转换接口API以及相关的方法。

由于需要自己实现,就上网找了找相关的资源和文章。有比较有趣的文章网址帖底部,请自行浏览观赏。我们最终确定使用自增ID进行base_convert($id,10,36);进行直接的转换,省去了一些不必要的算法和开销,也避免了每次生成的短连接的重复。为什么是36位呢,自行科普。 0~9(10位) a~z(26位)。此处不区分大小写,会把得到url统一小写转换。也许有人会担心短连接生成的过长。请看下面的代码。

//定义和用法
base_convert() 函数在任意进制之间转换数字。

//语法
base_convert(number,frombase,tobase)

//参数	描述
number	必需。原始值。
frombase	必需。数字原来的进制。
tobase	必需。要转换的进制。

//说明:
//返回一个字符串,包含 number 以 tobase 进制的表示。number 本身的进制由 frombase 指定。frombase 和 tobase 都只能在 2 和 36 之间(包括 2 和 36)。
//高于十进制的数字用字母 a-z 表示,例如 a 表示 10,b 表示 11 以及 z 表示 35。



 //进制转换 十进制转换成36进制
echo base_convert(9999999999999, 10, 36);
//得到的结果为:3jlxpt2pr   
//长度为9位 这可是9万亿的数目 一般数据量足够了。超越这个数据估计早就实现分表了吧。


//把36位的转换成为10进制的
echo base_convert(abcd, 36, 10);
//得到的结果为:481261
//可以互转多方便,且不需要额外的写其他函数,真是PHP福利。


//转换为1位数的能支撑 36个
//转换为2位数的能支撑 36*36 = 1296个
//转换为3位数的能支撑 36*36*36 = 46656个
//转换为5位数的能支撑 36*36*36*36*36 = 60466176个 6千万

还有更高级的可以a-z实现大小写区分也就是转换成为64进制。支撑更大的数据量。根据业务需要来看吧。

可以参考 http://www.dodobook.net/php/2712 PHP实现10进制和64进制的相互转换的方法

首先,为什么要短连接,一个是让url更短小,传播更方便,尤其是url中有中文和特殊字符,encode之后看起来很不优雅,传播起来也很容易因为丢了一个参数而不正确。至于生成算法,简单来说就是hash,hash的方法就很多了,请移步hash算法有关的帖子去脑补。那么如果将url看成一个字符串的话,常规的hash算法就解决问题了。当然url本身就是全球唯一的,本身就解决了hash碰撞的问题,所以可以按照url的规范分段hash,可以直接避免碰撞的问题。最后推荐的,简单实用的算法就是 id自增,来一个拿一个号,不论是单机还是分布式环境,自增id都是最完美的方案,不必考虑碰撞问题。