如何生成短链接
2023-10-06 07:02:05发布 浏览473次 信息编号:77266
友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。
如何生成短链接
这也是一个话题
//en…
//en…
描述
生成短链接。
想法
如果只是做题的话,其实有很多方法。
在实践中,应该使用分布式编号器(ID)
64位整数可以表示的范围是7亿,远远大于世界上网页的数量45亿。 当你得到一个长URL时,分配一个ID来生成一个短URL。
并且这样可以支持一个长URL对应多个短URL。 一般来说,对于长URL来说,在不同的地点、不同的用户等情况下,生成的短URL应该是不同的,这样可以在后端数据库中进行更好的数据分析。
为了方便转换成字符串,一般采用十六进制。 字符串中的一个字符总共可以是62个字母,包括大小写字母加数字。
一般使用7位字符串,62^7=35227=35216亿。
其他方法大概就是取HASH值的前N位,碰撞,缩短URL而不重复。 这个性能并不高。
代码
public class EncodeAndDecodeTinyURL {
Map map = new HashMap<>();
long index = 10000; // 这里是模拟一个当前计数值.
private static String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
private static int scale = 62;
// Encodes a URL to a shortened URL.
public String encode(String longUrl) {
String tinyUrl = indexToStr(index, 7);
map.put(tinyUrl, longUrl);
return tinyUrl;
}
public String indexToStr(long num, int length) {
StringBuilder sb = new StringBuilder();
int remainder = 0;
while (num > scale - 1) {
/**
* 对 scale 进行求余,然后将余数追加至 sb 中,由于是从末位开始追加的,因此最后需要反转(reverse)字符串
*/
remainder = Long.valueOf(num % scale).intValue();
sb.append(chars.charAt(remainder));
num = num / scale;
}
sb.append(chars.charAt(Long.valueOf(num).intValue()));
String value = sb.reverse().toString();
while (value.length() < length) {
value = "0" + value;
}
return value;
}
// Decodes a shortened URL to its original URL.
public String decode(String shortUrl) {
return map.get(shortUrl);
}
public static void main(String[] args) {
EncodeAndDecodeTinyURL codec = new EncodeAndDecodeTinyURL();
codec.decode(codec.encode("https://leetcode.com/problems/design-tinyurl"));
}
其他
以下内容来自武林的回答
如何储存
如何存储短网址和长网址的对应关系? 以短URL为key,长URL为value,可以存储在传统的关系型数据库中,比如MySQL,也可以存储在任何分布式KV数据库中,比如Redis。 如果你想手动设计这个存储,那就是另一个话题了。 你需要完整构建一个KV存储引擎轮子。 目前流行的KV存储引擎有哪些? 阅读他们的源代码。
301 或 302 重定向
这也是一个有趣的问题。 本题主要考验你对301和302的理解,以及对浏览器缓存机制的理解。 301 是永久重定向,302 是临时重定向。 短地址一旦生成就不会改变,因此使用301与http语义一致。 但如果您使用301、百度等搜索引擎,搜索时会直接显示真实地址,那么我们将无法统计短地址被点击的次数,也无法收集用户的、用户代理和其他信息。 这些信息可以用来做很多有趣的大数据分析,也是URL缩短服务提供商的主要利润来源。 所以,正确答案是 302 重定向。
防止攻击
如果一些别有用心的黑客在短时间内向服务器发送大量请求,很快ID就耗尽了,我们该怎么办?
首先,限制每天的IP请求总数。 如果数量超过阈值,则直接拒绝服务。 单纯限制IP请求数量是不够的,因为黑客一般都有上百万的肉鸡和IP地址,所以仅仅限制IP的作用不大。
您可以使用 Redis 作为缓存服务器。 不是存储 ID->长 URL,而是存储长 URL->ID。 只存储一天内的数据,采用LRU机制淘汰。 这样,如果黑客大量发送相同的长URL并直接从缓存服务器返回短URL,他将无法用完我们的ID。
参考
/如何基因...
提醒:请联系我时一定说明是从星空网上看到的!