日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

序列号生成的另一种玩法

發(fā)布時間:2025/4/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 序列号生成的另一种玩法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

通常我們生成序列號的時候喜歡把時間作為序列號的一種,但時間序列號的長度為15,這樣導致我們的序列號就非常長導致

1,存放時占用空間大,

2,查詢時效率慢

我們是不是可以把時間序列號變短呢?

我們知道:

根據(jù)ascII編碼表,我們可以看出

?

?

ASCII 碼字符?ASCII 碼字符?ASCII 碼字符?ASCII 碼字符
十進位十六進位?十進位十六進位?十進位十六進位?十進位十六進位
03220??056388?08050P?10468h
03321!?057399?08151Q?10569i
03422"?0583A:?08252R?1066Aj
03523#?0593B;?08353S?1076Bk
03624$?0603C<?08454T?1086Cl
03725%?0613D=?08555U?1096Dm
03826&?0623E>?08656V?1106En
03927'?0633F??08757W?1116Fo
04028(?06440@?08858X?11270p
04129)?06541A?08959Y?11371q
0422A*?06642B?0905AZ?11472r
0432B+?06743C?0915B[?11573s
0442C,?06844D?0925C\?11674t
0452D-?06945E?0935D]?11775u
0462E.?07046F?0945E^?11876v
0472F/?07147G?0955F_?11977w
048300?07248H?09660`?12078x
049311?07349I?09761a?12179y
050322?0744AJ?09862b?1227Az
051333?0754BK?09963c?1237B{
052344?0764CL?10064d?1247C|
053355?0774DM?10165e?1257D}
054366?0784EN?10266f?1267E~
055377?0794FO?10367g?1277FDEL

小寫字符a(97) 使用不同存儲時的編碼長度

二進制:01100001

八進制:141

十進制:97

十六進制:61

可以看出,隨著進制的增高,字符的長度也會越來越短,如果我們拿我們常用的0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ這個62個字符作為編碼,那么62進制就可以表示了。

再進行編碼前,我搜了一下git,上面已經(jīng)有代碼實現(xiàn)了(base62),我就不再實現(xiàn)一遍了,代碼如下:

1.編碼,將long型轉(zhuǎn)換為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輸出結(jié)果如下:

2OdCqJOH8 613534552694770 613534552694770

長度由15位變?yōu)?位,減少了40%的長度,當前查詢效率也得到相應的提升了。

是不是蠻有趣的?

?

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/8441259.html

總結(jié)

以上是生活随笔為你收集整理的序列号生成的另一种玩法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。