前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊base62与tinyURL

聊聊base62与tinyURL

作者头像
code4it
发布于 2018-09-17 06:42:59
发布于 2018-09-17 06:42:59
1.9K00
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

base64大家肯定是很熟悉了,那base62是什么东东,它常被用来做短url的映射。

ascii编码的62个字母数字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Value Encoding  Value Encoding  Value Encoding  Value Encoding
  0 a            17 r            34 I            51 Z
  1 b            18 s            35 J            52 0
  2 c            19 t            36 K            53 1
  3 d            20 u            37 L            54 2
  4 e            21 v            38 M            55 3
  5 f            22 w            39 N            56 4
  6 g            23 x            40 O            57 5
  7 h            24 y            41 P            58 6
  8 i            25 z            42 Q            59 7
  9 j            26 A            43 R            60 8
 10 k            27 B            44 S            61 9
 11 l            28 C            45 T
 12 m            29 D            46 U
 13 n            30 E            47 V
 14 o            31 F            48 W
 15 p            32 G            49 X
 16 q            33 H            50 Y

26个小写字母+26个大写字母+10个数字=62

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static final String BASE_62_CHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    public static final int BASE = BASE_62_CHAR.length();

62进制与十进制的映射

62进制转10进制

还记得二进制转十进制的算法么,从右到左用二进制的每个数去乘以2的相应次方,次方要从0开始。62进制转10进制也类似,从右往左每个数*62的N次方,N从0开始。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static long toBase10(String str) {
        //从右边开始
        return toBase10(new StringBuilder(str).reverse().toString().toCharArray());
    }

    private static long toBase10(char[] chars) {
        long n = 0;
        int pow = 0;
        for(char item: chars){
            n += toBase10(BASE_62_CHAR.indexOf(item),pow);
            pow++;
        }
        return n;
    }

    private static long toBase10(int n, int pow) {
        return n * (long) Math.pow(BASE, pow);
    }

十进制转62进制

还记得十进制转二进制的算法么,除二取余,然后倒序排列,高位补零。转62进制也类似,不断除以62取余数,然后倒序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static String fromBase10(long i) {
        StringBuilder sb = new StringBuilder("");
        if (i == 0) {
            return "a";
        }
        while (i > 0) {
            i = fromBase10(i, sb);
        }
        return sb.reverse().toString();
    }

    private static long fromBase10(long i, final StringBuilder sb) {
        int rem = (int)(i % BASE);
        sb.append(BASE_62_CHAR.charAt(rem));
        return i / BASE;
    }

短url的转换

主要思路,维护一个全局自增的id,每来一个长url,将其与一个自增id绑定,然后利用base62将该自增id转换为base62字符串,即完成转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Base62UrlShorter {

    private long autoIncrId = 10000;

    Map<Long, String> longUrlIdMap = new HashMap<Long, String>();

    public long incr(){
        return autoIncrId ++ ;
    }

    public String shorten(String longUrl){
        long id = incr();
        //add to mapping
        longUrlIdMap.put(id,longUrl);
        return Base62.fromBase10(id);
    }

    public String lookup(String shortUrl){
        long id = Base62.toBase10(shortUrl);
        return longUrlIdMap.get(id);
    }
}

测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Test
    public void testLongUrl2Short(){
        Base62UrlShorter shorter= new Base62UrlShorter();
        String longUrl = "https://movie.douban.com/subject/26363254/";
        String shortUrl = shorter.shorten(longUrl);
        System.out.println("short url:"+shortUrl);
        System.out.println(shorter.lookup(shortUrl));
    }

关于容量

自增id为long型,最大2^64 -1

doc

  • 534. Design TinyURL
  • 如何设计短网址系统(TinyURL)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
巧用 Base62 解决字段太短的问题
由于这次银联给的时间非常少,我们这边改动涉及到相关上游一起改造,所以我们已经开始设计,马上投入代码改造中。
andyxh
2022/05/10
1.2K0
巧用 Base62 解决字段太短的问题
设计一个短链接系统
我们可以讲十进制的数字id,转换为一个62进制的数,例如20201122就可以转换为WvOi。
用户3467126
2020/12/01
1.5K0
设计一个短链接系统
短链系统设计-存储设计
scalability 要求多高?存储和 qps 都不高,单机都能搞定。sql+1
JavaEdge
2022/09/14
5940
短链系统设计-存储设计
如何设计一个短链接系统
短链接是一种将长URL地址转换为较短、易于记忆的链接的技术。它通过使用特定的算法或服务将长链接压缩成更短的形式,以便在限制字符长度或需要更简洁的场景下使用。
柯柏技术笔记
2024/01/10
8620
如何设计一个短链接系统
【数据结构与算法】Leetcode刷题笔记
设计一个方法调用若干次,每次返回 1~max 的数字,从 1 开始,返回数字的比例减半,例如 max = 4,让大概
程序员波特
2024/10/11
2100
短链接的生成方式
短链接是一种 URL 简化服务, 比如:当你输入一个 URL https://www.xdull.com 时,它将返回一个简化的URL http://tinyurl.com/weuZn ,其中http://tinyurl.com/是提供服务的域名,后面的weuZn为简化后的URL的key值,通过这个key能还原成原来的真正的URL。
兜兜转转
2023/03/06
2.7K0
如何实现一个短链接服务 | 短链接生成原理
短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。
梦溪
2021/08/09
19.4K3
ByteByteGo学习笔记:URL短链服务设计
在互联网技术日新月异的今天,URL短链服务已经成为日常网络生活中不可或缺的一部分。每当想要分享一个冗长的网页链接,或者需要在对字符数量敏感的平台(如社交媒体、短信等)发布链接时,URL短链服务都能将长长的URL地址精简成短小、易于传播的链接。例如,将冗长的 https://www.systeminterview.com/q=chatsystem&c=loggedin&v=3&i=long 缩短为 https://tinyurl.com/y7keocwj,这不仅提升了用户体验,也方便了链接的分享和管理。
攻城狮笔记
2025/02/13
1590
49 Encode and Decode TinyURL
TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/design-tinyurl and it returns a short URL such as http://tinyurl.com/4e9iAk.
devi
2021/08/18
7210
【转】系统设计-第08章:短网址设计
在这一章中,我们将解决一个有趣而经典的系统设计面试问题:设计一个像tinyurl一样的URL缩短服务。
保持热爱奔赴山海
2024/10/29
1940
面试官:如何实现一个短链接服务?
原文链接:https://javadoop.com/post/url-shortener
cxuan
2020/12/17
2.9K0
面试官:如何实现一个短链接服务?
短链服务?用 Nest 自己写一个
用 0、1、2、3、4、5 的递增 id 标识每个 url,把映射关系存到数据库里。
神说要有光zxg
2023/12/04
4410
短链服务?用 Nest 自己写一个
搭建短链接平台详细分析及具体代码实现
短链接,又称缩略网址服务、缩址、短址、短网址、缩略网址、网址缩短、缩短网址、URL缩短等,指的是一种互联网上的技术与服务。此服务可以提供短URL以代替原来可能较长的URL,将长的URL地址缩短。
Mintimate
2021/08/12
3.9K0
搭建短链接平台详细分析及具体代码实现
string字符串扩展
/// <summary> /// /// </summary> public static class StringExtentions { /// <summary> /// 转换为MD5加密后的字符串(默认加密为32位) /// </summary> /// <param name="str"></param> /// <returns></returns> public
跟着阿笨一起玩NET
2022/12/09
9240
leetcode 新题型----SQL,shell,system design
leetcode 主要是一个针对北美的coder人群找工作的代码练习网站,我在2015年初次接触这个网站的时候,总共只有200多道题目,是一个类似acm 的a题网站。这些年变化越来越大,主要是因为找工作当然是多样化的考核过程,leetcode 也逐渐与时俱进,推出了下面几个类别的练习,今天我们随便挑几个练习一下:
流川疯
2019/01/18
1.3K0
base62编码
Base62编码是由10个数字、26个大写英文字母和26个小写英文字母组成,多用于安全领域。本文将介绍对数字进行Base62编码与解码的方法。 直接上代码,如下: /** * base62编码与解码key,由10个数字、26个大写英文字母和26个小写英文字母组成 * @var string */ private $key = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl
Marser
2018/06/25
5.4K0
用Redis实现长链转短链
在生活中有很多场景需要把长链接转化为短连接,比如微博限制字数为140字一条,那么如果我们需要发一些链接上去,但是这个链接非常的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被允许的,所以短链接应运而生了。
Lvshen
2022/05/05
8380
用Redis实现长链转短链
netty系列之:java中的base64编码器
什么是Base64编码呢?在回答这个问题之前,我们需要了解一下计算机中文件的分类,对于计算机来说文件可以分为两类,一类是文本文件,一类是二进制文件。
程序那些事
2022/04/01
8250
面试官说:你来设计一个短链接生成系统吧
相信大家在生活中,特别是最近的双十一活动期间,会收到很多短信,而那些短信都有两个特征,第一个是几乎都是垃圾短信,这个特点此处可以忽略不计,第二个特点是**链接很短**,比如下面这个:
秦怀杂货店
2021/12/04
6230
BASE64编码
附录:BASE64编码的原理(节选自http://www.vbzx.net/ArticleView/vbzx_Article_View_1199.asp)
源哥
2018/08/28
1.8K0
相关推荐
巧用 Base62 解决字段太短的问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验