序列号生成的另一种玩法
通常我们生成序列号的时候喜欢把时间作为序列号的一种,但时间序列号的长度为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
序列号生成的另一种玩法相关推荐
- GPT-3的50种玩法告诉你,它很酷,但是没有通过图灵测试
2020-07-31 01:42:19 作者 | 青 暮 编辑 | 丛 末 自从OpenAI开放GPT-3的API以来,不少人争相申请试用后获得了"门票",并相继在社交网络上推送自 ...
- 【Microsoft Azure 的1024种玩法】十五.通过Web浏览器对Auzre VM 服务器运维管理
[简介] Apache Guacamole是无客户端远程桌面网关.它支持标准协议,例如VNC,RDP和SSH.我们称其为无客户端,因为不需要插件或客户端软件.多亏了HTML5,在服务器上安装了鳄梨调味 ...
- 【Microsoft Azure 的1024种玩法】七十二.使用NodeJS手动编写调用Azure Cognitive Services Translator API代码获取其支持翻译的语言集
[简介] Azure Cognitive Services Translato 是一种基于云的神经网络机器翻译服务,同时也是 REST API 的 Azure 认知服务系列的一部分. 本篇文章将会主要 ...
- 智能化名片横空出世,细数AR名片的21种玩法
一些人可能认为,名片不过是承载着个人信息的卡片.一张好的名片不一定能保证你的成功,但绝对能让人印象深刻.名片遇上AR,又能碰撞出怎样的火花呢? 今天你AR了吗?快来看看AR名片的21种玩法 1)名片信 ...
- 【Microsoft Azure 的1024种玩法】六十二.利用Azure Private DNS 实现虚拟网络中域名的管理解析
[简介] Azure Private DNS是Azure为我们虚拟网络提供的安全可靠的DNS服务,我们无需自行配置DNS即可在虚拟网络中实现域名的解析及配置, 于此同时,我们在内网中也可以利用自己的自 ...
- 【Microsoft Azure 的1024种玩法】七十一.基于Azure Virtual Machines快速上手搭建Typecho博客系统
[简介] Typecho 是基于 PHP5 构建的开源跨平台博客系统,Typecho开源跨平台博客系统相较于wordpress .hexo有一定的性能优势,是我们记录文章内容的最佳首选博客,那么本篇文 ...
- 反诈宣传互动答题小程序及其三种玩法
最近,各地的反诈宣传活动,都在有条不紊的进行.所以,作为小程序开发者,特地出了一期关于反诈宣传的模板合集,一起来看看吧! 线上宣传具有便捷性和易传播性,为了进一步加大反诈骗宣传力度,我们要利用好这个渠 ...
- 超级智能玩具《小小机器人》|全新50种玩法,创造力之源
致砖<小小机器人>全新套装 电动+机械的完美结合 先来看看视频过过眼瘾吧 来自美国STEAM教育 让孩子跨学科学知识 积木向来是STEAM教育很重要的一部分,因为它涉及到了多种学科: 要搭 ...
- 超级智能玩具《小小机器人》首发|全新50种玩法,创造力之源
致砖<小小机器人>套装全新首发 电动+机械的完美结合 先来看看视频过过眼瘾吧 来自美国STEAM教育 让孩子跨学科学知识 积木向来是STEAM教育很重要的一部分,因为它涉及到了多种学科: ...
最新文章
- Crawler之Scrapy:Scrapy简介、安装、使用方法之详细攻略
- 邀请函|2021 云原生实战峰会,邀请您免费现场参会报名
- 计算机视觉之OpenCV教程 --- Mat图像类基础(二)
- int size java_int size()
- 三菱fx5u编程手册_FX5U系列PLC控制伺服3种方式
- 小波变换和motion信号处理(二)【转载】
- centeros6.8 mysql_Center os6.5 mysql
- JavaScript 移动和触摸框架
- Await Async和Thread.waitAll想法?未完待续
- Python使用hashlib模块生成给定文本数据的签名摘要信息(包括各种哈希函数)
- JavaScript继承方式详解[转]
- 计算机组成原理(白中英)简答题复习
- cmos和ttl_TTL和CMOS电平别傻傻分不清
- 科研画图——流程图软件draw.io
- pyenchant英文单词拼写检查
- Markdown学习
- V4L2文档翻译(十一)
- opencv拟合多边形
- ABAP-接口-tcode:SPROXY-tcode:SXI_MONITOR
- 检查软件下载是否完整 MD5 工具使用 ----- md5sum
热门文章
- spring boot第八讲
- python翻译成matlab_matlab语言转译成python
- php整蛊关机代码,整人代码大全
- mysql参数优化51cto_超详细MySQL数据库优化
- java 用来查找输出的函数_Solr复杂查询一:函数查询
- irule jar包无法导入_Java之Spring1:Spring简介、环境搭建、源码下载及导入MyEclipse...
- axure rp制作输入法_Axure教程丨制作自己的Axure元件库
- boot spring 接口接收数据_基于 Spring Boot 实现 Restful 风格接口,实现增删改查功能...
- oracle中字典指的是什么,ORACLE数据库中什么是数据字典及作用
- VC包含目录、附加依赖项、库目录及具体设置