序列号生成的另一种玩法
生活随笔
收集整理的這篇文章主要介紹了
序列号生成的另一种玩法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
通常我們生成序列號的時候喜歡把時間作為序列號的一種,但時間序列號的長度為15,這樣導致我們的序列號就非常長導致
1,存放時占用空間大,
2,查詢時效率慢
我們是不是可以把時間序列號變短呢?
我們知道:
根據ascII編碼表,我們可以看出
?
?
| ASCII 碼 | 字符 | ? | ASCII 碼 | 字符 | ? | ASCII 碼 | 字符 | ? | ASCII 碼 | 字符 | ||||
| 十進位 | 十六進位 | ? | 十進位 | 十六進位 | ? | 十進位 | 十六進位 | ? | 十進位 | 十六進位 | ||||
| 032 | 20 | ? | ? | 056 | 38 | 8 | ? | 080 | 50 | P | ? | 104 | 68 | h |
| 033 | 21 | ! | ? | 057 | 39 | 9 | ? | 081 | 51 | Q | ? | 105 | 69 | i |
| 034 | 22 | " | ? | 058 | 3A | : | ? | 082 | 52 | R | ? | 106 | 6A | j |
| 035 | 23 | # | ? | 059 | 3B | ; | ? | 083 | 53 | S | ? | 107 | 6B | k |
| 036 | 24 | $ | ? | 060 | 3C | < | ? | 084 | 54 | T | ? | 108 | 6C | l |
| 037 | 25 | % | ? | 061 | 3D | = | ? | 085 | 55 | U | ? | 109 | 6D | m |
| 038 | 26 | & | ? | 062 | 3E | > | ? | 086 | 56 | V | ? | 110 | 6E | n |
| 039 | 27 | ' | ? | 063 | 3F | ? | ? | 087 | 57 | W | ? | 111 | 6F | o |
| 040 | 28 | ( | ? | 064 | 40 | @ | ? | 088 | 58 | X | ? | 112 | 70 | p |
| 041 | 29 | ) | ? | 065 | 41 | A | ? | 089 | 59 | Y | ? | 113 | 71 | q |
| 042 | 2A | * | ? | 066 | 42 | B | ? | 090 | 5A | Z | ? | 114 | 72 | r |
| 043 | 2B | + | ? | 067 | 43 | C | ? | 091 | 5B | [ | ? | 115 | 73 | s |
| 044 | 2C | , | ? | 068 | 44 | D | ? | 092 | 5C | \ | ? | 116 | 74 | t |
| 045 | 2D | - | ? | 069 | 45 | E | ? | 093 | 5D | ] | ? | 117 | 75 | u |
| 046 | 2E | . | ? | 070 | 46 | F | ? | 094 | 5E | ^ | ? | 118 | 76 | v |
| 047 | 2F | / | ? | 071 | 47 | G | ? | 095 | 5F | _ | ? | 119 | 77 | w |
| 048 | 30 | 0 | ? | 072 | 48 | H | ? | 096 | 60 | ` | ? | 120 | 78 | x |
| 049 | 31 | 1 | ? | 073 | 49 | I | ? | 097 | 61 | a | ? | 121 | 79 | y |
| 050 | 32 | 2 | ? | 074 | 4A | J | ? | 098 | 62 | b | ? | 122 | 7A | z |
| 051 | 33 | 3 | ? | 075 | 4B | K | ? | 099 | 63 | c | ? | 123 | 7B | { |
| 052 | 34 | 4 | ? | 076 | 4C | L | ? | 100 | 64 | d | ? | 124 | 7C | | |
| 053 | 35 | 5 | ? | 077 | 4D | M | ? | 101 | 65 | e | ? | 125 | 7D | } |
| 054 | 36 | 6 | ? | 078 | 4E | N | ? | 102 | 66 | f | ? | 126 | 7E | ~ |
| 055 | 37 | 7 | ? | 079 | 4F | O | ? | 103 | 67 | g | ? | 127 | 7F | DEL |
小寫字符a(97) 使用不同存儲時的編碼長度
二進制:01100001
八進制:141
十進制:97
十六進制:61
可以看出,隨著進制的增高,字符的長度也會越來越短,如果我們拿我們常用的0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ這個62個字符作為編碼,那么62進制就可以表示了。
再進行編碼前,我搜了一下git,上面已經有代碼實現了(base62),我就不再實現一遍了,代碼如下:
1.編碼,將long型轉換為62進制字符串
/*** Encodes a decimal value to a Base62 <code>String</code>.* * @param b10* the decimal value to encode, must be nonnegative.* @return the number encoded as a Base62 <code>String</code>.*/public String encodeBase10(long b10) {if (b10 < 0) {throw new IllegalArgumentException("b10 must be nonnegative");}String ret = "";while (b10 > 0) {ret = characters.charAt((int) (b10 % 62)) + ret;b10 /= 62;}return ret;}2.解碼,逆過程
/*** Decodes a Base62 <code>String</code> returning a <code>long</code>.* * @param b62* the Base62 <code>String</code> to decode.* @return the decoded number as a <code>long</code>.* @throws IllegalArgumentException* if the given <code>String</code> contains characters not* specified in the constructor.*/public long decodeBase62(String b62) {for (char character : b62.toCharArray()) {if (!characters.contains(String.valueOf(character))) {throw new IllegalArgumentException("Invalid character(s) in string: " + character);}}long ret = 0;b62 = new StringBuffer(b62).reverse().toString();long count = 1;for (char character : b62.toCharArray()) {ret += characters.indexOf(character) * count;count *= 62;}return ret;}測試用例:
public static void main(String[] args) {Base62 encoder=new Base62();Long time=System.nanoTime();String timeStr=encoder.encodeBase10(time);System.out.println(timeStr);System.out.println(time);System.out.println(encoder.decodeBase62(timeStr));}console輸出結果如下:
2OdCqJOH8 613534552694770 613534552694770長度由15位變為9位,減少了40%的長度,當前查詢效率也得到相應的提升了。
是不是蠻有趣的?
?
轉載于:https://www.cnblogs.com/davidwang456/p/8441259.html
總結
以上是生活随笔為你收集整理的序列号生成的另一种玩法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东网络接入体系解密之高性能四层网关DL
- 下一篇: 阿里集团搜索和推荐关于效率稳定性的思考和