[java]尽可能短的唯一编码生成的问题

valuetodays 发布于 2017/06/15 09:20
阅读 4K+
收藏 1

最近在思考如何生成一个尽可能短的唯一编码时,在这个页面里http://blog.csdn.net/andy_miao858/article/details/9530245找到了一个方法,自己测试了下,发现生成了85w条数据,还未生成重复的,但是看到该页面的评论中说会重复,请大神解释一下。

PS:
1. UUID是可取的,取UUID的md5值也是可取的,但都是太长了。
2. 微信网页版(https://wx.qq.com/)生成了一个'10位的字符串'加上'=='组成了一个,请问,怎么保证唯一的。

加载中
1
xuqingkai
xuqingkai

最简单的就是固定标识+时间戳+毫秒(随机)

然后把数字部分转成16或32进制

比如A1706150952431234567

转成32进制为A1fbbn81mdnbg0

转成36进制为:Acyng1b4tdyos

v
valuetodays
该方案可行,我以前公司的订单号就是使用'yyyyMMddhhmmssSSS'+4位随机数,尽管生产上运行良好,但总是感觉订单号太长,后来用阿里大于测试短信功能,报变量太长(即订单号太长)这个错误,你这个转成16/32/64进制的方案可行。多谢。
0
紫泉-kwer
v
valuetodays
自增也是可以考虑的,但是自增要加锁……
0
_loop
_loop

 雪花算法

v
valuetodays
谢谢,已自行了解
0
DeMoNHaDeS
DeMoNHaDeS

以前也写过一个uuid缩短的方法,我的思路不一样。同样使用大小写英文和数字。

62^20 < 16^32 < 62^21

因此将uuid转到21位,可以保持与uuid相同的重复率,不过就是还是有点长。

DeMoNHaDeS
DeMoNHaDeS
回复 @valuetodays : 不是位运算,就是单纯的进制转换。https://github.com/demondevilhades/demos/blob/master/tools/src/main/java/test/tools/CustomUUID.java
v
valuetodays
对位运算了解不太多,不知可否提供博客地址?
0
ubibi
ubibi
自增是最简单明了的。
v
valuetodays
回复 @ubibi : 谢谢。这个类是可以解决自增的并发问题的,但是更倾向于生成一种无规则的字符串的。
ubibi
ubibi
回复 @valuetodays : java.util.concurrent.atomic.AtomicInteger;
ubibi
ubibi
回复 @valuetodays : AtomicInteger ??
v
valuetodays
是的,但是需要加锁的。
0
xuqingkai
xuqingkai

如果64进制就基本上是你要的效果了,

0
冷川
冷川

用redis搞个自增

v
valuetodays
谢谢,自增是可行的,但公司中没有使用redis的业务……
0
薯粉1Q84
薯粉1Q84

base62 参考 https://github.com/autolook/shortenurl

返回顶部
顶部