聊聊base62与tinyURL
序
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相关推荐
- TinyURL的实现原理
TinyURL[http://tinyurl.com]是一个在线web服务.它能将你任意输入的url简化一个由http://tinyurl.com/和一个随机字符串组成短url.访问短url会经过ht ...
- 面向对象设计原则_聊聊面向对象的6大设计原则
程序员都知道编程有 3 大类:面向过程.面向对象.面向函数.面向对象是被讨论的最多的,个人认为,这是因为 Java 之类的编程语言有强大的用户基础,本质还是因为比较符合人的直觉. 说到面向对象,大家可 ...
- python邮件发送哪个好_最全总结!聊聊 Python 发送邮件的几种方式
1. 前言 邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到 我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本.富文本.HTML 等格式的邮件 本文将聊聊利用 Python ...
- 今天聊聊分布式锁 No.86
好了切入正题,一直在工作中会聊到很多锁的问题,今天跟大家一起闲聊一下,究竟什么是锁,为什么需要锁,以及分布式的情况下,怎么设计和实现锁. 什么是锁? 明·魏禧<大铁椎传>上是这样解释的: ...
- 聊聊找工作中的项目经验问题(推荐系统和智能问答)
在求职过程中有这么一句话叫做"金九银十",也就是说,很多时候,求职的黄金时期就是在九月份和十月份,这两个月份中企业需求是最多的,求职的成功率也是最高的.但是随着AI方面的人才越来越 ...
- 2019年2月26日 Unique Email Addresses、To Lower Case、Encode and Decode TinyURL
今天开始加快速度,趁着还有空多刷几题,语言换成python提高速度了. 1. Unique Email Addresses 弱题,注意@符号前后的处理方式不同 class Solution(objec ...
- 聊聊Service Mesh:linkerd
[编者的话]随着企业逐渐将传统的单体应用向微服务或云原生应用的转变,虽然微服务或者云原生应用能给企业带来更多的好处,但也会带来一些具有挑战的问题,如怎么管理从单体应用转向微服务所带来的服务间通讯的复杂 ...
- 庖丁解牛迭代器,聊聊那些藏在幕后的秘密
0x00 前言 \\ 在我之前的一篇博客<细说C#:不是"栈类型"的值类型,从生命周期聊存储位置>的最后,我以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够 ...
- 聊聊Unsafe的一些使用技巧
记得初学 Java 那会,刚学完语法基础,就接触到了反射这个 Java 提供的特性,尽管在现在看来,这是非常基础的知识点,但那时候无疑是兴奋的,瞬间觉得自己脱离了"Java 初学者" ...
最新文章
- 3.2 表达式的类别与类型
- 直播「拯救」互联网?
- Pandas to_numeric
- cassss服务未启动_systemd时代的服务管理
- pandas 删除特定行根据条件_记录21个Pandas技巧
- C语言的全局变量和局部变量的作用域
- web小白,实战操作拿到网站后台账户和密码
- 数据取证三剑客 ——合天网安实验室学习笔记
- 线代 [7]|实对称矩阵
- 入职5年前端工程师针对web前端小白,作出的职业规划建议
- 怎样设置txt的默认打开方式(比如用nodePad++)
- 跟着弦哥学人工智能2—HAND-CRAFTED RULES实现的人工智能及其缺陷
- php 取字符串任意两个的中间部分,掐头去尾
- 数据分析学习之roc曲线
- cannot have an existing value
- 入手评测 海信65e7g pro和雷鸟65r645c 选哪个
- 【记第一次kaggle比赛】PetFinder.my - Pawpularity Contest 宠物预测
- QT设置背景图片的Qss实现方式
- 测绘工程和计算机专业哪个好,测绘工程专业就业前景如何
- 电容倍乘器【转自阿莫论坛】
热门文章
- python语法手册chm-python3.5.2官方帮助文档 参考手册(CHM版)
- 2!=5 or 0在python中是否正确-Python 中的 or and 运算,看这一篇就够
- python 代码-代码的重试机制(python简单实现)
- python简单代码hello-[代码全屏查看]-python初学之helloworld
- python爬虫原理-干货|如何入门 Python 爬虫?爬虫原理及过程详解
- 导入torchvision出现:AttributeError: module ‘torch.jit‘ has no attribute ‘unused‘错误
- 简单排序:直接插入排序
- 安装Docker:解决container-selinux = 2.9问题
- excel vba 不可查看
- Day12 Java异常处理与程序调试