网站客服:zx81024163 |

如何生成短链接

2023-10-06 07:02:05发布    浏览476次    信息编号: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。

参考

/如何基因...

提醒:请联系我时一定说明是从星空网上看到的!