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

ascii编码的62个字母数字

Value Encoding  Value Encoding  Value Encoding  Value Encoding0 a            17 r            34 I            51 Z1 b            18 s            35 J            52 02 c            19 t            36 K            53 13 d            20 u            37 L            54 24 e            21 v            38 M            55 35 f            22 w            39 N            56 46 g            23 x            40 O            57 57 h            24 y            41 P            58 68 i            25 z            42 Q            59 79 j            26 A            43 R            60 810 k            27 B            44 S            61 911 l            28 C            45 T12 m            29 D            46 U13 n            30 E            47 V14 o            31 F            48 W15 p            32 G            49 X16 q            33 H            50 Y

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

    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开始。

    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取余数,然后倒序。

    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字符串,即完成转换。

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 mappinglongUrlIdMap.put(id,longUrl);return Base62.fromBase10(id);}public String lookup(String shortUrl){long id = Base62.toBase10(shortUrl);return longUrlIdMap.get(id);}
}

测试

    @Testpublic 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)

聊聊base62与tinyURL相关推荐

  1. TinyURL的实现原理

    TinyURL[http://tinyurl.com]是一个在线web服务.它能将你任意输入的url简化一个由http://tinyurl.com/和一个随机字符串组成短url.访问短url会经过ht ...

  2. 面向对象设计原则_聊聊面向对象的6大设计原则

    程序员都知道编程有 3 大类:面向过程.面向对象.面向函数.面向对象是被讨论的最多的,个人认为,这是因为 Java 之类的编程语言有强大的用户基础,本质还是因为比较符合人的直觉. 说到面向对象,大家可 ...

  3. python邮件发送哪个好_最全总结!聊聊 Python 发送邮件的几种方式

    1. 前言 邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到 我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本.富文本.HTML 等格式的邮件 本文将聊聊利用 Python ...

  4. 今天聊聊分布式锁 No.86

    好了切入正题,一直在工作中会聊到很多锁的问题,今天跟大家一起闲聊一下,究竟什么是锁,为什么需要锁,以及分布式的情况下,怎么设计和实现锁. 什么是锁? 明·魏禧<大铁椎传>上是这样解释的: ...

  5. 聊聊找工作中的项目经验问题(推荐系统和智能问答)

    在求职过程中有这么一句话叫做"金九银十",也就是说,很多时候,求职的黄金时期就是在九月份和十月份,这两个月份中企业需求是最多的,求职的成功率也是最高的.但是随着AI方面的人才越来越 ...

  6. 2019年2月26日 Unique Email Addresses、To Lower Case、Encode and Decode TinyURL

    今天开始加快速度,趁着还有空多刷几题,语言换成python提高速度了. 1. Unique Email Addresses 弱题,注意@符号前后的处理方式不同 class Solution(objec ...

  7. 聊聊Service Mesh:linkerd

    [编者的话]随着企业逐渐将传统的单体应用向微服务或云原生应用的转变,虽然微服务或者云原生应用能给企业带来更多的好处,但也会带来一些具有挑战的问题,如怎么管理从单体应用转向微服务所带来的服务间通讯的复杂 ...

  8. 庖丁解牛迭代器,聊聊那些藏在幕后的秘密

    0x00 前言 \\ 在我之前的一篇博客<细说C#:不是"栈类型"的值类型,从生命周期聊存储位置>的最后,我以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够 ...

  9. 聊聊Unsafe的一些使用技巧

    记得初学 Java 那会,刚学完语法基础,就接触到了反射这个 Java 提供的特性,尽管在现在看来,这是非常基础的知识点,但那时候无疑是兴奋的,瞬间觉得自己脱离了"Java 初学者" ...

最新文章

  1. 3.2 表达式的类别与类型
  2. 直播「拯救」互联网?
  3. Pandas to_numeric
  4. cassss服务未启动_systemd时代的服务管理
  5. pandas 删除特定行根据条件_记录21个Pandas技巧
  6. C语言的全局变量和局部变量的作用域
  7. web小白,实战操作拿到网站后台账户和密码
  8. 数据取证三剑客 ——合天网安实验室学习笔记
  9. 线代 [7]|实对称矩阵
  10. 入职5年前端工程师针对web前端小白,作出的职业规划建议
  11. 怎样设置txt的默认打开方式(比如用nodePad++)
  12. 跟着弦哥学人工智能2—HAND-CRAFTED RULES实现的人工智能及其缺陷
  13. php 取字符串任意两个的中间部分,掐头去尾
  14. 数据分析学习之roc曲线
  15. cannot have an existing value
  16. 入手评测 海信65e7g pro和雷鸟65r645c 选哪个
  17. 【记第一次kaggle比赛】PetFinder.my - Pawpularity Contest 宠物预测
  18. QT设置背景图片的Qss实现方式
  19. 测绘工程和计算机专业哪个好,测绘工程专业就业前景如何
  20. 电容倍乘器【转自阿莫论坛】

热门文章

  1. python语法手册chm-python3.5.2官方帮助文档 参考手册(CHM版)
  2. 2!=5 or 0在python中是否正确-Python 中的 or and 运算,看这一篇就够
  3. python 代码-代码的重试机制(python简单实现)
  4. python简单代码hello-[代码全屏查看]-python初学之helloworld
  5. python爬虫原理-干货|如何入门 Python 爬虫?爬虫原理及过程详解
  6. 导入torchvision出现:AttributeError: module ‘torch.jit‘ has no attribute ‘unused‘错误
  7. 简单排序:直接插入排序
  8. 安装Docker:解决container-selinux = 2.9问题
  9. excel vba 不可查看
  10. Day12 Java异常处理与程序调试