• <acronym id="eyrpt"></acronym>
    <track id="eyrpt"></track>
    <p id="eyrpt"></p>

      <table id="eyrpt"><ruby id="eyrpt"></ruby></table>
      <table id="eyrpt"></table>

    1. 當前位置:首頁 > 短網址資訊 > 正文內容

      使用60進制的程序仿了一個新浪微博短鏈接生成器

      與其說仿新浪短網址其實算是個嚼頭,招引人們的眼球,對于常規的進制算法可以去參看數據結構一書 
      通過取模方式計算出對應的n進制數,t.cn短網址的原理大致如下:

      Java代碼  收藏代碼
      1. int nv = 2//進制  

      2. int n = 4;  

      3. List<Integer> ll = new ArrayList<Integer>();  

      4. while (n >= 1) {  

      5.     ll.add(n%nv);  

      6.     System.out.print(n % nv + ",");  

      7.     n = n / nv;  

      8. }  

      9. System.out.println();  

      10. //排列后的值  

      11. for (int x=ll.size()-1;ll.size()>0&&x>=0;x--) {  

      12.     System.out.print(ll.get(x));  

      13. }  

      這種方法仍是針對10進制內相互轉換有用,由于你不可能使用字母和數字去取模運算 
      所以就有了數組代替純數字的方法進行運算 

      Java代碼  收藏代碼
      1. import java.util.HashSet;  

      2. import java.util.Random;  

      3.   

      4. public class ShortUrl {  

      5.     private static final String[] l = {   

      6.         "0""1""2""3""4""5""6""7""8""9",   

      7.         "a""b""c""d""e""f""g""h""i""j",  

      8.         "k""l""m""n""o""p""q""r""s""t",  

      9.         "u""v""w""x""y""z",   

      10.         "A""B""C""D""E""F""G""H""I""J",   

      11.         "K""L""M""N""O""P""Q""R""S""T",   

      12.         "U""V""W""X""Y""Z"};  

      13.       

      14.     private static int count = 100;  

      15.   

      16.     private static int getCount(){  

      17.         if(count>999)count = 100;  

      18.         return count++;   

      19.     }  

      20.       

      21.     //TentoN(這里是你想轉換的數 ,這里是你想轉換為多少進制 2-62之間)  

      22.     public static String TentoN(long value, int number) {  

      23.         if (number <= 1 || number > l.length) {  

      24.             throw new RuntimeException("Faild");  

      25.         }  

      26.         //負數處理  

      27.         if (value < 0) {  

      28.             return "-" + TentoN(0 - value, number);  

      29.         }  

      30.         if (value < number) {  

      31.             return l[(int)value];  

      32.         } else {  

      33.             long n = value % (long)number;  

      34.             return (TentoN(value / number, number) + l[(int)n]);  

      35.         }  

      36.     }  

      37.   

      38.     /** 

      39.      * 返回4位隨機數 

      40.      * @return 

      41.      */  

      42.     public static Integer getRandom2(){  

      43.         Integer i = new Random().nextInt(9999);  

      44.         while(i<1000)    i=i<<1;  

      45.         return i;  

      46.     }  

      47.       

      48.     public static void main(String[] args) throws InterruptedException {  

      49.         long a = System.currentTimeMillis();  

      50.         HashSet<String> hs = new HashSet<String>();  

      51.         for(int i=0;i<1000;i++){  

      52.             String s = TentoN((System.currentTimeMillis()-1323333000000L), 62)+TentoN((long)getCount(),62);  

      53.             hs.add(s);  

      54.             System.out.println(s);  

      55.         }  

      56.         System.out.println(hs.size());  

      57.           

      58.         long b = System.currentTimeMillis();  

      59.         System.out.println("毫秒:"+(b-a));  

      60.     }  

      61. }  

      2017-03-14 09:56 循環1000次后運行后得到的最終幾條成果 
      1000次無重復,耗時47毫秒 
      yMV53b 
      yMV53c 
      yMV53d 
      1000 
      毫秒:47 

      不過沒多長時刻,數據長度就漲到了8位啦~ 

      高并發的疑問,實際運用中肯定會存在一個疑問,那就是多個用戶同一時刻內進行了一個操作,成果就是多條記錄返回的值是一樣的,開端的時分我思考的是運用隨機數的辦法,不過隨機數并不是一個萬全的解決辦法,由于隨機并不表明不會一樣,也許就會2個用戶杯具的得到了同一個隨機數,那么數據庫的僅有條件就被破壞了 
      解決辦法本來也不難,假如對于含有訂單的項目可以運用流水號作為擴展字符將成果僅有化 
      不過訂單的長度有時分也不會是短位數。 
      比較簡略的辦法就是運用一個全局僅有的計數器。 
      通過getCount辦法咱們可以在1毫秒內最多取得900個不會重復的3位數字 
      當然咱們沒有必要每毫秒都去重置這個計數器,由于即便2毫秒得到了1800個數據也不會重復,由于前面的體系毫秒數已經改變了 

      對于微博來說生成一個短鏈接本來不難,首要的仍是防止重復,假如運用10進制的數字辦法進行保存的話數據量會非常驚人,也許起初的時分仍是百位千位或者萬位,后面跟著數據量的遞加,長度會越來越大,因而運用多進制的辦法可以放緩數據遞加的疑問 
      這里我思考的仍是簡略的毫秒數計算辦法。 
      運用System.currentTimeMillis()咱們可以取得一個14位的當時時刻的毫秒數,當然直接運用的話沒有疑問,不過為了生成數據的長度咱們盡可能將他的開端時刻提前,比方一個項目2012年才開端運用,咱們就沒有必要非從2008年那個節點開端,如上面的代碼我隨便減去了一個毫秒數 1323333000000L 詳細是什么時分咱們沒有必要去了解,這個只是為了減少時刻差及最終生成的短網址長度而做的一步操作 
      假如你減去了的正好的當時時刻,那么生成的短連接就只有1位了 
      已知存在的疑問:跟著時刻的推移,幾天 幾年后,毫秒數的添加肯定會使數據長度不斷添加,這個仍是根據實際需要去修改吧,對于數據量較少的,比方一天的數據量遠遠小于百位的,運用ddMMyyyy 日 月 年 加上補位數就可以滿意改變的需求了,由于年月日方向顛倒 也可以添加擾碼度防猜測 

      好了所有相關的部分都簡略介紹完了,詳細的運用需要的大家再持續研究好了,也希望有非常好解決辦法的童鞋們大方貼出代碼來分享 

      掃描二維碼推送至手機訪問。

      版權聲明:本文由短鏈接發布,如需轉載請注明出處。

      本文鏈接:http://www.virginiabusinesslawupdate.com/article_189.html

      分享給朋友:

      相關文章

      FT12短網址:繪制隨機不規則三角彩條——小談FT12短網址主頁的實現

      FT12短網址:繪制隨機不規則三角彩條——小談FT12短網址主頁的實現

      引言8月6號早讀文章由@FT12短網址分享。正文從這開始~緣起最近感覺自己搭的一個項目資料匯總的項目,主頁真的是一點美感都沒有,非常簡單粗暴。就想來點改版,讓主頁顯得高大上一點。改版前的效果是這樣的:尋思著怎么改版,剛開始想就簡單加個背景圖...

      短網址和二維碼在共享單車掃碼開車上的應用

      如果我問大家現在城市和以前的城市最大的變化是什么,估計大部分人會不假思索的想到共享單車。目前共享單車正以不可阻擋之勢席卷全國,大街上以及城市的每一個角落正在被ofo、摩拜單車、小鳴單車等等所占領。共享單車這項期初并不被看好的項目,正在逐漸改...

      深入剖析nginx時間緩存

      深入剖析nginx時間緩存

      本文適合對nginx實現原理比較感興趣的同學閱讀,需要具備一定的服務端編程知識。一、背景在服務器開發領域,時間的準確度關系到系統能否正常運行,尤其是當系統中存在超時事件需要處理時。但是系統時間的獲取需要一次昂貴的系統調用,作為一款成熟的服務...

      短網址網站開發必須理解的Java中SPI機制

      短網址網站開發必須理解的Java中SPI機制

      今天小編通過探析FT12短網址提供的,在短網址網站設計中比較常用的Java SPI機制,希望給大家在實際開發實踐、學習開源項目提供參考。SPI全稱Service Provider Interface,是Java提供的一套用來被第三方實現或者...

      IPO的暴利盛宴即將結束,除了影視大牛還有黑天鵝

      IPO的暴利盛宴即將結束,除了影視大牛還有黑天鵝

      [ 短網址導讀 ] 文娛工業的爆發式增加和業界的“本錢狂躁癥”共同催動了影視公司入主本錢商場的潮流。院線公司、廣電運營商和影視制造公司紛繁加入了排號IPO的部隊中,而現狀的確幾家歡樂幾家愁。圖像來自“123rf.com.cn”跟著...

      阿里如何實現高性能分布式強一致的獨立 Paxos 基礎庫?

      阿里如何實現高性能分布式強一致的獨立 Paxos 基礎庫?

      Paxos 從理論界到工業界,阿里怎樣實現分布式系統的一致性? 1 寫在前面 近來 Paxos 的分享和討論越來越頻繁,它是分布式系統保持一致性的法寶,但是同時又有著最難理解的算法之“美譽”。在阿里看來,雖然 Paxos 有一定社區熱...

      發表評論

      訪客

      ◎歡迎參與討論,請在這里發表您的看法和觀點。
      一本色综合网久久
    2. <acronym id="eyrpt"></acronym>
      <track id="eyrpt"></track>
      <p id="eyrpt"></p>

        <table id="eyrpt"><ruby id="eyrpt"></ruby></table>
        <table id="eyrpt"></table>