摘要:進(jìn)制轉(zhuǎn)進(jìn)制也類(lèi)似,從右往左每個(gè)數(shù)的次方,從開(kāi)始。短的轉(zhuǎn)換主要思路,維護(hù)一個(gè)全局自增的,每來(lái)一個(gè)長(zhǎng),將其與一個(gè)自增綁定,然后利用將該自增轉(zhuǎn)換為字符串,即完成轉(zhuǎn)換。測(cè)試關(guān)于容量自增為型,最大如何設(shè)計(jì)短網(wǎng)址系統(tǒng)
序
base64大家肯定是很熟悉了,那base62是什么東東,它常被用來(lái)做短url的映射。
ascii編碼的62個(gè)字母數(shù)字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個(gè)小寫(xiě)字母+26個(gè)大寫(xiě)字母+10個(gè)數(shù)字=62
public static final String BASE_62_CHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; public static final int BASE = BASE_62_CHAR.length();62進(jìn)制與十進(jìn)制的映射 62進(jìn)制轉(zhuǎn)10進(jìn)制
還記得二進(jìn)制轉(zhuǎn)十進(jìn)制的算法么,從右到左用二進(jìn)制的每個(gè)數(shù)去乘以2的相應(yīng)次方,次方要從0開(kāi)始。62進(jìn)制轉(zhuǎn)10進(jìn)制也類(lèi)似,從右往左每個(gè)數(shù)*62的N次方,N從0開(kāi)始。
public static long toBase10(String str) { //從右邊開(kāi)始 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); }十進(jìn)制轉(zhuǎn)62進(jìn)制
還記得十進(jìn)制轉(zhuǎn)二進(jìn)制的算法么,除二取余,然后倒序排列,高位補(bǔ)零。轉(zhuǎn)62進(jìn)制也類(lèi)似,不斷除以62取余數(shù),然后倒序。
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的轉(zhuǎn)換
主要思路,維護(hù)一個(gè)全局自增的id,每來(lái)一個(gè)長(zhǎng)url,將其與一個(gè)自增id綁定,然后利用base62將該自增id轉(zhuǎn)換為base62字符串,即完成轉(zhuǎn)換。
public class Base62UrlShorter { private long autoIncrId = 10000; MaplongUrlIdMap = new HashMap (); 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); } }
測(cè)試
@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)); }關(guān)于容量
自增id為long型,最大2^64 -1
doc534. Design TinyURL
如何設(shè)計(jì)短網(wǎng)址系統(tǒng)(TinyURL)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/67549.html
摘要:序本文主要研究一下的異常實(shí)例代碼異常日志如下最后調(diào)用這里調(diào)用獲取連接如果沒(méi)有連接會(huì)新創(chuàng)建一個(gè),走的是這里先是調(diào)用了獲取連接,然后調(diào)用進(jìn)行連接這里委托給這里如果有設(shè)置的話(huà),則會(huì)創(chuàng)建一個(gè)調(diào)用進(jìn)行連接,如果連接未 序 本文主要研究一下httpclient的connect timeout異常 實(shí)例代碼 @Test public void testConnectTimeout()...
摘要:比如其中一個(gè)的應(yīng)用場(chǎng)景,在中取代的改進(jìn)使用的方案是從代碼層分析耗時(shí)差值原因,盡管兩者都使用了位操作進(jìn)行計(jì)算,但在單位編碼長(zhǎng)度上多了數(shù)值判斷,由此導(dǎo)致其速度下降。 現(xiàn)在幾乎所有企事業(yè)單位、政府機(jī)構(gòu)、軍工系統(tǒng)等的IT生產(chǎn)系統(tǒng)都會(huì)用到Base64編碼,從RSA安全密鑰到管理信息系統(tǒng)登錄入口回跳,目前越來(lái)越多的IT系統(tǒng)研發(fā)者開(kāi)始使用 Base62x 替換 Base64. -Base62x 提供...
摘要:同的其他版本相通,實(shí)現(xiàn)了跨編程語(yǔ)言運(yùn)行時(shí)環(huán)境的數(shù)據(jù)安全交換。函數(shù)式編程的除了式的寫(xiě)法,還提供了函數(shù)式編程的調(diào)用方式,列如下。函數(shù)式編程適合單一次啟動(dòng)并運(yùn)行的使用場(chǎng)景。 在此前的一篇Blog(-R/G2SW )中,-gMIS 吉密斯優(yōu)化更新+分組項(xiàng)區(qū)段AddGroupBySeg/+復(fù)制AddByCopy等, 我們提到注冊(cè)動(dòng)作registerAct: 改進(jìn)增加 Base62x.class....
摘要:同的其他版本相通,實(shí)現(xiàn)了跨編程語(yǔ)言運(yùn)行時(shí)環(huán)境的數(shù)據(jù)安全交換。函數(shù)式編程的除了式的寫(xiě)法,還提供了函數(shù)式編程的調(diào)用方式,列如下。函數(shù)式編程適合單一次啟動(dòng)并運(yùn)行的使用場(chǎng)景。 在此前的一篇Blog(-R/G2SW )中,-gMIS 吉密斯優(yōu)化更新+分組項(xiàng)區(qū)段AddGroupBySeg/+復(fù)制AddByCopy等, 我們提到注冊(cè)動(dòng)作registerAct: 改進(jìn)增加 Base62x.class....
摘要:同的其他版本相通,實(shí)現(xiàn)了跨編程語(yǔ)言運(yùn)行時(shí)環(huán)境的數(shù)據(jù)安全交換。函數(shù)式編程的除了式的寫(xiě)法,還提供了函數(shù)式編程的調(diào)用方式,列如下。函數(shù)式編程適合單一次啟動(dòng)并運(yùn)行的使用場(chǎng)景。 在此前的一篇Blog(-R/G2SW )中,-gMIS 吉密斯優(yōu)化更新+分組項(xiàng)區(qū)段AddGroupBySeg/+復(fù)制AddByCopy等, 我們提到注冊(cè)動(dòng)作registerAct: 改進(jìn)增加 Base62x.class....
閱讀 3579·2023-04-25 19:39
閱讀 3905·2021-11-18 13:12
閱讀 3711·2021-09-22 15:45
閱讀 2518·2021-09-22 15:32
閱讀 828·2021-09-04 16:40
閱讀 3857·2019-08-30 14:11
閱讀 1967·2019-08-30 13:46
閱讀 1649·2019-08-29 15:43