短链生成算法

何为短链

短链:即一个较短的链接地址,这个链接地址通常指的是url。

为什么需要短链

现而今,互联网无处不在。我们无时无刻都在上网,查看信息,分享信息。而分享信息很多时候都是通过分享链接来实现的,比如说说、日志、群聊等等。一个奇长无比链接分享出来,特别恶心人。以及微博等社交软件发表、分享通常有字数限制。此时,短链需求应运而生。

短链原理

将一个url部分冗长的信息通过哈希算法进行压缩,并建立哈希值与原链之间的映射。每当通过短链访问时,后端服务就通过短链中的哈希值找到对应的原链,然后通过请求转发或者重定向的方式转至原链接内容。

短链算法

基于以上原理可知,任何一种哈希算法都可以作为短链生成的算法基础,这里给大家看到的是市面上广泛采用的基于MD5的算法。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var md5  = require('./md5').md5;

function getLinkShort(base,url){

var key = 'alexis';
var urlhash = md5(key,url);
var len = urlhash.length;
var charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
var shortUrlList = [];

//将加密后的串分成4段,每段4字节,对每段进行计算,一共可以生成四组短连接
for (var i = 0; i < 4; i++) {
var urlhashPiece = urlhash.substr(i * len / 4, len / 4);
//将分段的位与0x3fffffff做位与,0x3fffffff表示二进制数的30个1,即30位以后的加密串都归零
var hex = parseInt(urlhashPiece,16) & 0x3fffffff; //此处需要用到hexdec()将16进制字符串转为10进制数值型,否则运算会不正常

var shortUrl = base;
//生成6位短连接
for (var j = 0; j < 6; j++) {
//将得到的值与0x0000003d,3d为61,即charset的坐标最大值
shortUrl += charset.charAt(hex & 0x0000003d);
//循环完以后将hex右移5位
hex = hex >> 5;
}

shortUrlList.push(shortUrl);
}

return shortUrlList;
}


console.log(getLinkShort('http://t.cn/','http://www.baidu.com'));

运行结果

1
2
3
4
[ 'http://t.cn/vDS0KK',
'http://t.cn/vvDCO4',
'http://t.cn/b984CK',
'http://t.cn/ebfzHS' ]

可以看到上面的方法生成了四个短链,可根据需要,采取其中一个作为短链即可。

你的鼓励,是我前进的动力!