一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java短網址服務(TinyURL)生成算法

java短網址服務(TinyURL)生成算法

2021-05-27 13:56Java教程網 Java教程

這篇文章主要為大家詳細介紹了java短網址服務生成算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前不久做了一個優惠劵的分享功能,其中一個功能就是生成一個優惠劵分享短鏈接。生成的短鏈接要求每個鏈接都是唯一的,并且長度盡可能短。在網上查了一下相關的思路,發現了一個不錯的算法。這個算法的思路就是用[a-za-z0-9]建立一個長度為62的矩陣,然后把矩陣打亂,再生成一個全局唯一的數字,再把這個數字用矩陣內的元素表示轉換成62進制,生成的鏈接長度最大才11位。所以短鏈接的生成關鍵點就變成了如何生成一個全局唯一的數字和實現進制的轉換。

1、生成全局唯一的數字

這本質是一個分布式id的問題。如果簡單處理的話可以借用redis的incr操作這樣每次取到的id都是單調遞增且唯一的。另外一種方式是借用mysql,這里不是借用mysql的主鍵的auto_incr特性。而是每一臺應用來請求時分配一個范圍比如 s1 [100-200], s2 來請求的時候就分配 [201-301],本質是利用樂觀鎖進行一個cas操作。

如果不想借助外部去生成id的話,可以用uuid算法。uuid長度12個字節組成由,以下幾個部分組成。

  • 4個字節表示的unix timestamp,
  • 3個字節表示的機器的id
  • 2個字節表示的進程id
  • 3個字節表示的計數器

uuid是一類算法的統稱,具體有不同的實現。優點是每臺機器可以獨立產生id,理論上保證不會重復,所以天然是分布式的,缺點是生成的id太長,不僅占用內存,而且索引查詢效率低。

還有一個叫twitter snowflake算法,本質上看起來與uuid有些類似。 

java短網址服務(TinyURL)生成算法

總的來說redis,mysql解決方案就比較簡單直接可以滿足大部分的場景,如果要保證高性能和高可用的話uuid和twitter snowflake算法就更合適,實現起來相對復雜一些。  

2、進制轉換

這個操作就相對簡單了。直接上代碼:

java" id="highlighter_202171">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
 * 短鏈接生成
 */
public class tinyurl {
 
  public static final char[] array =
          {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
          'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd',
          'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm',
          'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd',
          'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm'};
 
  public static map<character, integer> charvaluemap = new hashmap<character, integer>();
 
  //初始化map
  static {
    for (int i = 0; i < array.length; i++) charvaluemap.put(array[i], i);
  }
 
 
  public static void main(string[] args) {
    for (int i = 0; i < 100; i++) {
      long number = long.max_value - i;
      string decimalstr = numberconverttodecimal(number, 62);
      system.out.println(number + " 轉換成 " + decimalstr);
      long tonumber = decimalconverttonumber(decimalstr, 62);
      system.out.println(decimalstr + " 轉換成 " + tonumber);
    }
  }
 
 
  /**
   * 把數字轉換成相對應的進制,目前支持(2-62)進制
   *
   * @param number
   * @param decimal
   * @return
   */
  public static string numberconverttodecimal(long number, int decimal) {
    stringbuilder builder = new stringbuilder();
    while (number != 0) {
      builder.append(array[(int) (number - (number / decimal) * decimal)]);
      number /= decimal;
    }
    return builder.reverse().tostring();
  }
 
  /**
   * 把進制字符串轉換成相應的數字
   * @param decimalstr
   * @param decimal
   * @return
   */
  public static long decimalconverttonumber(string decimalstr, int decimal) {
    long sum = 0;
    long multiple = 1;
    char[] chars = decimalstr.tochararray();
    for (int i = chars.length - 1; i >= 0; i--) {
      char c = chars[i];
      sum += charvaluemap.get(c) * multiple;
      multiple *= decimal;
    }
    return sum;
  }
 
 
}

這里面有個小優化就是用charvaluemap記錄每個字符對應的數值,這是一個用空間換時間的策略優化,把o(n)的時間降為o(1)。

另外通常我們要記錄短網址與長網址的對應的關系,相對于直接存儲短網址的而言,存儲對應的數值id會更省空間。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女脱了内裤张开腿亲吻男生 | 色美| 91麻豆精品国产自产在线 | 日韩精品欧美高清区 | 欧美亚洲综合另类 | 成人在线视频观看 | 91精品啪在线观看国产91九色 | 亚久久伊人精品青青草原2020 | 俄罗斯一级成人毛片 | 亚洲婷婷在线视频 | 北岛玲在线视频 | 女人和男人搞鸡 | 美女被绑着吸下部的故事 | 欧亚精品一区二区三区 | 免费看60分钟大片视频播放 | 国产亚洲精aa在线观看不卡 | 红楼梦黄色小说 | 87影院在线观看视频在线观看 | 婷婷婷色 | 成人永久免费福利视频网站 | 国产成人亚洲精品91专区高清 | 亚洲骚图| 91.prom在线观看国产 | 国产亚洲精品美女久久久 | 农夫69小说恋老妇小说 | 丝袜高跟小说 | 好大好湿好硬好爽好深免费视频 | 国产欧美综合精品一区二区 | 日剧整部剧护妻狂魔免费观看全集 | 亚洲spank男男实践网站 | 欧美乱子伦xxxx12在线 | 日本黄色大片免费观看 | 牛牛色婷婷在线视频播放 | 天天综合色天天综合色sb | 四虎最新永久免费网址 | 狠狠夜夜久久日日91av | 国产66 | 国产一卡2卡3卡四卡高清 | 国产亚洲综合精品一区二区三区 | 四虎网站入口 | 男人狂躁女人下面狂叫图片 |