• 作者:老汪软件技巧
  • 发表时间:2024-10-31 15:00
  • 浏览量:

这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。

一般来说,短链服务都是使用302实现重定向,因为可以利用短链来统计访问数量之类的数据。

小年直接贴一个ChatGPT的回答

_长链短链问题_断链短链长链

生成短链

短链的生成方式常见的有两种

小年项目选用的是哈希算法,也比较推荐哈希算法。一个是实现起来比较简单,另外一个是哈希算法生成的短链比较无规则,跟我们平时收到的营销短信比较类似。

长链短链问题_断链短链长链_

当然具体场景还是要具体分析,发号器的方案也有它的优点

_断链短链长链_长链短链问题

不过小年这里主要讲一下哈希算法。

网上推荐最多的是 MurmurHash 算法,对比我们常用的 MD5、SHA这类哈希算法来说,最大的优势就是快!

MurmurHash 是一种非加密的高效哈希算法,由 Austin Appleby 于 2008 年开发。该算法因其高性能、均匀分布和较低的碰撞率,成为了很多高效数据处理场景的首选,特别是在哈希表、缓存、分布式系统和大数据处理中,同时也是许多知名公司和框架的首选散列算法。

MurmurHash 的特点

高性能:MurmurHash 的计算速度非常快,特别适合大规模数据处理的场景。其高效性得益于简单的位运算和乘法操作。

非加密:MurmurHash 不是为加密设计的,因此不能保证数据的安全性。但它的目标是快速生成散列值,而不需要复杂的安全计算。

良好的分布性:MurmurHash 生成的散列值分布均匀,碰撞率低,这对于需要分散存储数据的场景非常关键,比如哈希表或分布式存储系统。

多版本:

MurmurHash 与其他哈希算法的对比

与 MD5、SHA-1 比较:

与 CityHash 和 xxHash 比较:

MurmurHash 提供了两种长度的哈希值,32 bit,128 bit, 32 bit 可以表示 42.9 亿的数据,基本能够应付我们常见的业务场景了。

当然,为了能够得到极致简短的短链,还可以将哈希值进行62进制的转换。

public static void main(String[] args) {
    String rawUrl = "http://edisonz.cn/archives/groovy";
    HashFunction hashFunction = Hashing.murmur3_32();
    HashCode hashCode = hashFunction.hashString(rawUrl, StandardCharsets.UTF_8);
    System.out.println(hashCode.asInt());// 1936285200
    System.out.println(hashCode);// 105e6973
    System.out.println(intToBase64(hashCode.asInt()));// 1PqlUg
}

哈希冲突,这个问题也比较好解。不同长链哈希值一致的情况,可以在长链中加入 “盐值”(salt) 后再做哈希,访问的时候再移除掉 salt,就是正常的长链。

高性能架构

当然,上面仅仅是短链服务的一个理论和实现原理,要设计一个能够真正应用于实际业务场景的企业级短链服务,还有很多细节点需要我们去思考和挖掘的。

而且这也是一道高频的面试问题,相信有同学可能碰到过:如何设计一个高性能的短链服务。

小年就个人的看法简单分享一下,要是有不足的地方可以补充哈

小年就从两个维度来简单分享自己的一个看法,当然有建议或者不足的地方欢迎大家改正和补充~

数据层应用层十分钟,部署一个短链服务

相信看完上面的内容后,大家对短链

看过小年上面的分享后,相信大家对短链也有一定程度的了解。

短链的原理和整体实现其实并不复杂,小年使用 Next.js 实现了一个简单易用的短链服务。

有兴趣的同学可以了解一下:十分钟!免费部署一个自己的短链服务!

Demo 体验:slink-code.vercel.app/

每一步都是进步!

我是宅小年,一个写Bug小能手