文档章节

短链接设计与实现

 黄瓜与土豆
发布于 03/26 22:00
字数 894
阅读 36
收藏 0

3 月,跳不动了?>>>

1.什么是短链接 
就是把普通网址,转换成比较短的网址。比如:http://t.cn/RlB2PdD 这种,在微博这些限制字数的应用里。好处不言而喻。短、字符少、美观、便于发布、传播。 
2.交互流程

a)用户访问短链接:http://t.cn/RtFFvic

b)短链接服务器t.cn收到请求,根据URL路径RtFFvic获取到原始的长链接:http://blog.csdn.net/poem_qianmo/article/details/52344732

c)服务器返回302状态码,将响应头中的Location设置为:[http://blog.csdn.net/poem_qianmo/article/details/52344732]

d)浏览器重新向http://blog.csdn.net/poem_qianmo/article/details/52344732发送请求

e)返回响应

说明:301 是永久重定向,302 是临时重定向。短地址一经生成就不会变化,所以用 301 是符合 http 语义的。同时对服务器压力也会有一定减少。
但是如果使用了 301,我们就无法统计到短地址被点击的次数了。而这个点击次数是一个非常有意思的大数据分析数据源。能够分析出的东西非常非常多。所以选择302虽然会增加服务器压力,但是我想是一个更好的选择。

3.  算法实现

a.哈希算法

最常见的短网址实现方案便是使用哈希算法,相信肯定有很多人说用 MD5,SHA 等算法,其实这样做有点杀鸡用牛刀了,而且既然是加密就意味着性能上会有损失,我们其实不关心反向解密的难度,反而更关心的是哈希的运算速度和冲突概率。能够满足这样的哈希算法有很多,这里推荐 Google 出品的 MurmurHash 算法,MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。与其它流行的哈希函数相比,对于规律性较强的 key,MurmurHash 的随机分布特征表现更良好。非加密意味着着相比 MD5,SHA 这些函数它的性能肯定更高(实际上性能是 MD5 等加密算法的十倍以上),也正是由于它的这些优点,所以虽然它出现于 2008,但目前已经广泛应用到 Redis、MemCache、Cassandra、HBase、Lucene 等众多著名的软件中。

Hashing.murmur3_32().hashString(longUrl, StandardCharsets.UTF_8).toString();

b.随机数算法

这个算法如果容量比较大的时候,性能会变低,因此要根据使用情况选择合适的长度。

public class ShorterUrlGeneratorRandom implements ShorterUrlGenerator {
    public static char[] VALID_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();
    private static Random random = new Random(System.currentTimeMillis());
    private int length = 4;

    public ShorterUrlGeneratorRandom() {
    }

    public ShorterUrlGeneratorRandom(int length) {
	setLength(length);
    }

    public int getLength() {
	return length;
    }

    public void setLength(int length) {
	this.length = length;
    }

    String generate(int seed) {
	char[] sortUrl = new char[length];
	for (int i = 0; i < length; i++) {
	    sortUrl[i] = VALID_CHARS[seed % VALID_CHARS.length];
	    seed = random.nextInt(Integer.MAX_VALUE) % VALID_CHARS.length;
	}
	return new String(sortUrl);
    }

   

    @Override
    public String getShorterUrl(String longUrl) {
	String shortUrl;
	shortUrl = generate(random.nextInt(Integer.MAX_VALUE));
	return shortUrl;
    }

c.自增序列算法

维护一个 ID 自增生成器,比如 1,2,3 这样的整数递增 ID,当收到一个长链转短链的请求时,ID 生成器为其分配一个 ID,再将其转化为 62 进制,拼接到短链域名后面就得到了最终的短网址 。实现可以采用 数据库自增主键 、 类 uuid 等方式。

© 著作权归作者所有

粉丝 0
博文 19
码字总数 10149
作品 0
西安
私信 提问
加载中

评论(0)

TinyFramework/urlshorter

#urlshorter 首先我要说,开源托管,必须得 @红薯 家的。 上一次本人写过一篇博客《长URL转短连接的简单设计与实现》,由于写得比较仓促,是缺少设计的,因此方案也是不完整的,看到大家非常...

TinyFramework
2018/11/22
0
0
短网址(short URL)系统的原理及其实现

背景 提供一个短址服务 你有没有发现,我们的任务中出现长 URL 就会比较麻烦?如果有一个短址生成器就好了。虽然市面上有很多,但是我们可以重复发明一个轮子,利用这个机会尝试一下简单的 ...

琯琯
2018/01/20
0
0
java长链接转短链接代码和如何跳转使用

一、实现原理 1. 将长网址用md5算法生成32位签名串,分为4段,,每段8个字符。 2. 对这4段循环处理,取每段的8个字符, 将他看成16进制字符串与0x3fffffff(30位1)的位与操作,超过30位的忽略处...

流石一刻
2019/10/08
74
0
微博或腾讯微博的短链接,是否可能有算法直接实现

因为有需求,将长连接转为短链接。 但是微博短链的api调用频次有限制,可能满足不了应用的需求。 1、麻烦各位大神能否告知可否用算法实现。 2、或是因为短链接的实现可能需要短链服务端有存储...

奔驰的蜗牛
2015/06/10
1.3K
3
短视频挑战-活动运营

创建一个挑战,设置投票机制,活动周期是两周,被投票视频最多的前三名,可以获得相应的奖品或奖金,每个用户在该活动内,可以投票一次,用户登录后产生专属的推广链接H5页面,每邀请三个用户...

qqjq547
2018/08/09
2
0

没有更多内容

加载失败,请刷新页面

加载更多

visual studio 生成指定扩展名文件

朱正刚
23分钟前
11
0
IDEA Tomcat 日志乱码解决汇总

IDEA Tomcat 日志乱码解决汇总 第三种没解决,第二种配置后解决了 https://blog.csdn.net/sinat_32404247/article/details/90287700...

三三的宁
37分钟前
10
0
C/C++内存检查

诉求 内存泄漏 内存越界 栈内存越界 堆内存越界 实现 valgrind:除了栈越界外,几乎所有的检查 gcc的sanitize:可以检查包括栈越界在内的几乎所有情况

chuqq
40分钟前
23
0
【附录】1、tapd在公司敏捷开发中的运用

一、概述 公司业务发展较快,业务从无到有,需要快速的迭代和交付,项目流程不规范,开发测试各种问题,随着项目增多,项目管理问题越来越难。 各种问题的频发,让我们对当前的项目协作模式进...

卖小女孩的小火柴
昨天
23
0
Android 上显示 PDF 文件

使用 WebView 配合 pdf.js 在 Android 上显示 PDF 文件 最近在 手机上要显示 PDF 文件,在搜索引擎上找到了很多方案,大体上有以下几种: 使用提供的在线服务,例如 Google 文档预览服务,m...

佛系编码
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部