国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

聊聊base62與tinyURL

phoenixsky / 639人閱讀

摘要:進制轉進制也類似,從右往左每個數的次方,從開始。短的轉換主要思路,維護一個全局自增的,每來一個長,將其與一個自增綁定,然后利用將該自增轉換為字符串,即完成轉換。測試關于容量自增為型,最大如何設計短網址系統

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

ascii編碼的62個字母數字
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

    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 longUrlIdMap = 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);
    }
}

測試

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67549.html

相關文章

  • 聊聊jdk httpclient的connect timeout異常

    摘要:序本文主要研究一下的異常實例代碼異常日志如下最后調用這里調用獲取連接如果沒有連接會新創建一個,走的是這里先是調用了獲取連接,然后調用進行連接這里委托給這里如果有設置的話,則會創建一個調用進行連接,如果連接未 序 本文主要研究一下httpclient的connect timeout異常 實例代碼 @Test public void testConnectTimeout()...

    張利勇 評論0 收藏0
  • Base62x比Base64的編碼速度更快嗎?

    摘要:比如其中一個的應用場景,在中取代的改進使用的方案是從代碼層分析耗時差值原因,盡管兩者都使用了位操作進行計算,但在單位編碼長度上多了數值判斷,由此導致其速度下降。 現在幾乎所有企事業單位、政府機構、軍工系統等的IT生產系統都會用到Base64編碼,從RSA安全密鑰到管理信息系統登錄入口回跳,目前越來越多的IT系統研發者開始使用 Base62x 替換 Base64. -Base62x 提供...

    tainzhi 評論0 收藏0
  • -Base62x 新增 -Perl 版本技術實現 Base62x.pm

    摘要:同的其他版本相通,實現了跨編程語言運行時環境的數據安全交換。函數式編程的除了式的寫法,還提供了函數式編程的調用方式,列如下。函數式編程適合單一次啟動并運行的使用場景。 在此前的一篇Blog(-R/G2SW )中,-gMIS 吉密斯優化更新+分組項區段AddGroupBySeg/+復制AddByCopy等, 我們提到注冊動作registerAct: 改進增加 Base62x.class....

    WelliJhon 評論0 收藏0
  • -Base62x 新增 -Perl 版本技術實現 Base62x.pm

    摘要:同的其他版本相通,實現了跨編程語言運行時環境的數據安全交換。函數式編程的除了式的寫法,還提供了函數式編程的調用方式,列如下。函數式編程適合單一次啟動并運行的使用場景。 在此前的一篇Blog(-R/G2SW )中,-gMIS 吉密斯優化更新+分組項區段AddGroupBySeg/+復制AddByCopy等, 我們提到注冊動作registerAct: 改進增加 Base62x.class....

    oujie 評論0 收藏0
  • -Base62x 新增 -Perl 版本技術實現 Base62x.pm

    摘要:同的其他版本相通,實現了跨編程語言運行時環境的數據安全交換。函數式編程的除了式的寫法,還提供了函數式編程的調用方式,列如下。函數式編程適合單一次啟動并運行的使用場景。 在此前的一篇Blog(-R/G2SW )中,-gMIS 吉密斯優化更新+分組項區段AddGroupBySeg/+復制AddByCopy等, 我們提到注冊動作registerAct: 改進增加 Base62x.class....

    weij 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<