短网址原理和实现

1.背景介绍

相信很多人手机上都收到过一些营销短信,短信里面有时候会附带一些网址,如下图

这些网址往往都是非常短,但是当我们打开之后,如果你仔细观察,中间会有跳转,最终浏览器地址栏显示的网址并不是你短信里面看到的网址,这就是短网址!

2.原理和应用

短网址一般是采用一个非常短域名下,路径参数一般只有3-6个字符组成,非常简洁!

使用短网址的前提是先生成短网址,主要是采用某种算法让一段短的字符对应一个长的字符,比如说从常用的0-9、a-z、A-Z共62个字符中选择6个字符,那意味着有62的6次方种组合,大概有568亿不重复的短网址可用!

服务器通过路径参数查询到真实的长网址,然后使用301/302跳转到真实的网址即可!

关于跳转,301 是永久重定向,302 是临时重定向。短地址一经生成就不会变化,所以用 301 是符合 http 语义的,浏览器会记录跳转地址,同时对服务器压力也会有一定减少。但是如果使用了 301,我们就无法统计到短地址被点击的次数了,如果对数据统计有要求的话,使用302跳转可能比较好一些!

短网址的主要好处是方便传输记忆,特别是在短信里面使用的时候,短信对内容字数有限制,还有比如说微博分享也使用了短网址!

3.市面现有案例

目前市面上有很多免费的短链接服务,功能基本上都一样,也没有什么限制!

(1)百度的短链接(dwz.cn/),百度不仅仅提供了网页入口,也提供了接口和开发文档,简单易用!

(2)新浪的短链接(sina.lt/),目前仅提供网页入口,未发现接口服务!

(3)淘宝的短链接(tb.am/),目前仅提供网页入口,未发现接口服务!

市面还有很多其它的小的公司提供短链接服务,有些是部分免费,有些短链接是有效期的,这里不一一介绍!

4.常用算法

网上比较流行的算法有进制算法、摘要(Hash)算法、随机数算法,下面简单介绍一下:

一.进制算法

这个算法网上也有叫作自增序列算法,特点就是永不重复,设置 id 自增,一个 10进制 id 对应一个62进制的数值,1对1,也就不会出现重复的情况,这个利用的就是低进制转化为高进制时,字符数会减少的特性。

计算机中常见的进制有2进制,8进制,10进制,16进制,进制越大,能够表示的数越大,占用的字数也越少。下面举个例:

10进制的1000,在8进制里面是1750,在16进制里面就是3E8,那在62进制里面呢?有人说,计算机里面没有62进制。。。虽然没有,但是我们可以造一个,进制的转换算法是固定的,最常见的就是“除基取余法”!

我们假设62进制的字符序列为 0-9a-zA-Z,顺序可以打乱,但是应该固定下来,是一个从0角标开始的到61的数组,我们暂且称之为字母表!

====> 1000/62 = 16,余8

====> 16/62 = 0,余16

余数得到的数字是16、8,然后找到字母表里面角标为16和8的字符拼起来,就是g8,非常短,只有2位数!假如说我们想至少产生6位字符,那么我们可以从一个比较大的数字开始,具体可以看下图:

1位	62	0 - 61
2位	3844	62 - 3843
3位	约 23万	3844 - 238327
4位	约 1400万	238328 - 14776335
5位	约 9.1亿	14776336 - 916132831
6位	约 568亿	916132832 - 56800235583
复制代码

二.Hash算法

第一种方式:

简单的对长链接进行加盐md5,会生成一个32位的字符串,随机从里面取6个字符,或者简单粗暴取最后6位,但是md5只包含0-9A-Fa-f,比字母表的里面字符还少,冲突几率更大!

第二种方式:

1.将长网址 md5 生成 32 位签名串,分为 4 段, 每段 8 个字节

2.对这四段循环处理, 取 8 个字节, 将他看成 16 进制串与 0x3fffffff(30位1) 与操作, 即超过 30 位的忽略处理

3.这 30 位分成 6 段, 每 5 位的数字作为字母表的索引取得特定字符, 依次进行获得 6 位字符串

4.总的 md5 串可以获得 4 个 6 位串,取里面的任意一个就可作为这个长 url 的短 url 地址

生成的方式更加复杂,重复的几率低,但是依然会出现冲突!

三.随机数算法

这个更简单,直接对这个62个字符数组做随机选择,选择其中6个字符当作短链接码,简单易用,但是难免会出现重复冲突!

四.算法对比

第一种算法只要解决自增id问题就可以避免冲突,自增id可以采用数据库自增主键,每次生成短码只需一次数据库操作(insert操作,获取主键id,然后算出短码即可)

第二种和第三种算法其实都差不多,都是依赖于程序随机,容易出现冲突,这就需要每次在插入数据库的时候判重,效率低一些!

5.安全

短链接虽然方便了传输和记忆,但是由于链接组成的字符个数少,更容易被爆破、猜测攻击,攻击者可以轻松遍历所有字符组成的链接!

所以不建议使用短链接发送具有私密性的网址,比如说重置密码链接,对一些权限、敏感信息的链接要做好二次鉴权!

转载于:https://juejin.im/post/5ce3ec5d6fb9a07ea712e5e0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
APTED(Approximate Tree Edit Distance)算法是一种用于计算树之间编辑距离的算法,它通过动态规划的方式计算两个树之间的最小编辑距离。该算法的时间复杂度为$O(n^6)$,但是实际运行效率很高,并且可以在很的时间内处理大型树。 APTED算法的实现步骤如下: 1. 预处理:对于两个树,首先需要将它们转化为二叉树,使得每个节点的子节点数目不超过2。如果某个节点的子节点数目大于2,则需要在该节点上添加虚拟节点,将该节点的子节点重排列,使得它们成为该虚拟节点的子节点。 2. 动态规划:定义两个树$T_1$和$T_2$之间的编辑距离为$d(T_1,T_2)$。使用动态规划的方式来计算$d(T_1,T_2)$,具体来说,定义二维数组$D_{i,j}$表示$T_1$的前$i$个节点和$T_2$的前$j$个节点之间的编辑距离,则有以下递推公式: - $D_{i,j}=i+j$,当$i=0$或$j=0$时,即一个树为空树,另一个树的距离为它的节点数。 - $D_{i,j}=\min\{D_{i-1,j}+1,D_{i,j-1}+1,D_{i-1,j-1}+c(i,j)\}$,当$i>0$且$j>0$时,即两个树都不为空树。其中$c(i,j)$表示$T_1$中第$i$个节点和$T_2$中第$j$个节点之间的转换代价,如果两个节点相同,则$c(i,j)=0$,否则$c(i,j)=1$。 3. 输出结果:最终的结果即为$D_{n_1,n_2}$,其中$n_1$和$n_2$分别表示两个树的节点数目。 APTED算法的原理是通过将两个树转化为二叉树,并使用动态规划的方式计算它们之间的编辑距离。由于转化为二叉树后,每个节点的子节点数目不超过2,因此可以使用二维数组存储编辑距离,并通过递推公式来计算编辑距离。虽然时间复杂度较高,但实现简单,且可以处理大型树。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值