短网址的3种算法:进制算法、随机数算法和HAS

  在Web 2.0的今天,不得不说,短网址已经是一个潮流。前段时间有人在公众号里问我 java 如何实现短网址功能,今天简单的说一下短网址的相关算法!

  短网址,或者说短域名。顾名思义,就是把长的 URL 转成短的 URL, 现在提供这种服务的有很多公司。比如百度的,新浪的,谷歌的等。

  短网址的解析过程

  当我们在浏览器里输入 https://mrw.so/fJPYNN 回车后,DNS首先解析获得 https://mrw.so / 的 IP 地址。当DNS获得IP地址以后,会向这个地址发送HTTP GET请求,这个时候 https://mrw.so/服务器会把请求通过 HTTP 301 重定向到对应的长URL https://www.zhrt.com.cn 。浏览器会再次发起请求,请 https://www.zhrt.com.cn 网址。

  根据 GitHub 上 star 数量最多的十个短网址服务对应的算法,大致分为三类:进制算法、随机数算法和HASH算法。下面我们分别说说它们的实现原理!

  短网址进制算法

  算法简述:一个以数字、大小写字母共62个字符的任意进制的算法。

  数据库中ID递增,当ID为233,则对应短网址计算过程如下:

  设置序列为“0123456789abcdefghijklmnopqrstuvwxyz”

  233/36=6

  233%36= 17

  依次取上述字符的6位,17位,则为6h

  其生成之后的短网址为xx.xx/6h 。

  短网址随机数算法

  算法简述:每次对候选字符进行任意次随机位数选择,拼接之后检查是否重复

  若要求位数为2,则其对应短地址为计算过程如下:

  设置字符序列“0123456789abcdefghijklmnopqrstuvwxyz”

  根据字符个数设置最大值为35,最小值为0,取2次随机数假设为:6,17

  依次取上述字符的6位和17位,则为6h

  其生成之后的短网址为xx.xx/6h 。

  短网址HASH算法

  算法简述:对id进行hash操作( 可选:利用随机数进行加盐),并检查是否重复

  设置ID自增,若ID=233,则其对应短地址为计算过程如下:

  取随机数为盐

  对233进行sha1加密为: aaccb8bb2b4c442a7c16a9b209c9ff448c6c5f35:2

  要求位数为7,直接取上述加密结果的前7位为:aaccb8

  其生成之后的短网址为xx.xx/2e8c027 。

  短网址的本质

  短网址本质上是实现了一个映射函数 f: X -> Y 。而这个映射函数必须同时具有两个特点:

  如果 x1 != x2, 则 f (x1) != f(x2);

  对于每一个 y, 能够找到唯一的一个 x 使得 f(x) = y;

  对于任何的线性函数,比如 f(x) = 2x,都满足这样的条件。

  java 实现短网址

  根据上面的解释,下面我来实现一个简单的短网址算法!

  短网址重定向

  Mrw.so短网址一般都会使用301重定向,对原网址不仅没有损害,还有导流量和权重的作用,但是,据说有些大厂是302重定向的,具体怎样就不好说了。