工作中经常会有生成唯一字符串的需求。通常最容易想到的是UUID。UUID的唯一性毋庸置疑,但是32位的长度也容易让人退避三舍。也曾经想过参考《短网址生成方案》来生成一串ID,但是试验了一下发现唯一性不太好。

最终采用的方案是时钟方案,简单来说就是用当前时间戳做唯一ID。

采用时间戳做ID,秒或毫秒都容易产生重复,换成纳秒在单节点上就没问题了。参考百度百科关于纳秒的描述就能清楚为什么纳秒级别的时间戳不会产生重复:

光在真空中一纳秒仅传播0.3米。个人电脑的微处理器执行一道指令(如将两数相加)约需2至4纳秒。

我们生成一条唯一ID所需的CPU指令绝不止一道,因此用纳秒作单机唯一ID是绰绰有余的。在测试中发现,即使是千分之一纳秒也足够我们在PC机上生成唯一ID了。

至于长度:对原始值做一次Base62处理,长度就能缩减到令人满意的程度。

不多废话,直接上代码:

public static synchronized String gen() {

StringBuilder builder = new StringBuilder(System.nanoTime() / 1000 + "");

if (SEQ.incrementAndGet() % 10 == 0) {

SEQ.incrementAndGet();

}

builder.append(FORMAT.format(SEQ.get()));

if ((MAX_PAD_SIZE - 1) == SEQ.get()) {

SEQ.set(1);

}

long v = Long.parseLong(builder.reverse().toString());

return Base62.encode(v);

}

这里用千分之一纳秒做基数(经测试,基数在10w分之一纳秒内都是安全的),再加上1~99的顺序号来生成唯一ID。最终可以保证在大于10纳秒(近似)的时间区间内不会产生重复值。

为了缩减长度,对字符串做了 Base62处理。在处理前又将纳秒数值做了一次翻转处理。不难想象,如果直接使用原始值来做Base62处理,因为时钟的特征,最终生成的值的前几位都是相同的。

来看一下这个程序生成的ID:

aSPog4cC

d4t1xZdt

g2tkZVqv

jrinwXx5

m8ZIAKVr

oUB5nzS5

rZa1gPAl

uD12VZ3A

8dnItkTj

八位的长度,唯一且整齐。下面是一个单元测试:

@Test

public void gen() {

int size = 10240;

Set set = new HashSet<>();

for (int i = 0; i < size; i++) {

String code = ShortCode.gen();

//System.out.println(code);

set.add(code);

}

Assert.assertEquals(size, set.size());

}

这里只对10240的规模做了测试。因为唯一ID是基于时钟生成的,所以测试时整体规模的大小不影响ID的唯一性(和短链接方案不一样)。但是太小了也不行——顺序号会发挥作用。10240算是一个中庸的值,足够暴露问题,也不会有太多的冗余。

仍然需要强调一下:这个方案只能保证在(当前)单机上的唯一性,如果是集群范围内建议采用其他方案,或者加上一两位机器ID。

总结

到此这篇关于java唯一字符串ID生成方案的文章就介绍到这了,更多相关java唯一字符串ID生成内容请搜索聚米学院以前的文章或继续浏览下面的相关文章希望大家以后多多支持聚米学院!

java生成唯一的五位字符串_java唯一字符串ID生成方案详解相关推荐

  1. java实现线程同步的方法_Java实现线程同步方法及原理详解

    一.概述 无论是什么语言,在多线程编程中,常常会遇到多个线同时操作程某个变量(读/写),如果读/写不同步,则会造成不符合预期的结果. 例如:线程A和线程B并发运行,都操作变量X,若线程A对变量X进行赋 ...

  2. java 判断端口是否被占用_java检测端口是否被占用详解

    Java可以通过Socket类来检测端口是否被占用: import java.net.*; import java.io.*; public class Main { public static vo ...

  3. java的循环控制结构有哪些_java中的控制结构(if,循环)详解

    1 说明JAVA语言中三种控制循环结构的代码形式(其他 1. while(condition){ statements; } 其中,condition是任何布尔表达式,其返回值为true 或 fals ...

  4. java黄金分割数的解题思路_java 实现黄金分割数的示例详解

    黄金分割数 0.618 与美学有重要的关系.舞台上报幕员所站的位置大约就是舞台宽度的 0.618 处, 墙上的画像一般也挂在房间高度的 0.618 处,甚至股票的波动据说也能找到 0.618 的影子- ...

  5. java mod 函数的使用方法_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  6. java中北大学ppt总结+课后习题第四章(小宇特详解)

    java中北大学ppt总结+课后习题第四章(小宇特详解) 继承 子类与父类 继承是根据现有类创建新的类的机制,由继承而得到的新类称为子类(subclass)或派生类(derived class),被继 ...

  7. Java中常见RuntimeException与其他异常表及Exception逻辑关系详解

    Java中常见RuntimeException与其他异常表及Exception逻辑关系详解 前言 常见`RuntimeException` 其他错误类型 `Error`类 `Exception`类 E ...

  8. java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...

    原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...

  9. Java调用SMSLib用单口短信猫发送短信详解

    技术园地 当前位置:短信猫网站主页 > 技术园地 > [转载]Java调用SMSLib用单口短信猫发送短信详解 发布时间:2017/02/09 点击量:620 SMSLib是Apache的 ...

  10. java生成唯一字符串_java唯一字符串ID生成方案详解

    工作中经常会有生成唯一字符串的需求.通常最容易想到的是UUID.UUID的唯一性毋庸置疑,但是32位的长度也容易让人退避三舍.也曾经想过参考<短网址生成方案>来生成一串ID,但是试验了一下 ...

最新文章

  1. 启动hadoop的节点
  2. 解决编译twrp3.0.3遇到的问题
  3. java final bigd_【BigData】Java基础_常量
  4. 【Spring】CGLIB动态代理
  5. 关于android中的ramdisk.img及uImage无法包含驱动模块(*.ko)的问题
  6. 应用动态html教学反思,12月份教学反思:百分数的应用(一)反思
  7. Axure RP 9 for mac 高保真原型图 - 案例18 【导航栏-展开、收起】导入元件库
  8. c++ idea 插件_idea快速开发插件
  9. ACL2021 | 任务型和开放域对话系统
  10. 运算放大器节点电压方程_比例运算放大器电路
  11. winedit使用教程_BCDEdit命令怎么使用?Win10下BCDEdit使用教程(包含常用参数命令)...
  12. JDK1.8 关于list集合Lambda的使用
  13. AUTOMATE THE BORING STUFF WITH PYTHON读书笔记 - 第8章:INPUT VALIDATION
  14. 2020年哨兵数据批量下载(USGS)
  15. aix 安装oracle smit install_latest,记录一次AIX 4.3.0+ORACLE 8.0.5恢复过程
  16. wustl计算机科学世界排名,2020年圣路易斯华盛顿大学排名TFE Times美国最佳计算机科学硕士专业排名第49...
  17. 2018排行VR眼镜哪个好,什么VR眼镜好?VR评测:UGP VR眼镜就是牛!
  18. Leetcode PHP题解--D58 693. Binary Number with Alternating Bits
  19. 混合云是实现业务敏捷性的关键
  20. Astar、A星算法解决八数码问题--python实现

热门文章

  1. 深交所互动平台_“国六”标准实施在即,互动平台“抖出”大波概念股
  2. 获取交换机和PC网卡接口对应关系
  3. Exception in thread “main“ java.lang.NumberFormatException
  4. C/C++ 中 int 转 string,string 转 int 的几种方法
  5. 饥荒服务器物品指令,饥荒控制台指令大全物品大全服务器管理命令大全.docx
  6. imshow显示图像为纯白或者纯黑或者为杂点(noise)原因分析(下篇)
  7. ButterKnife 懒人神器 使用步骤 备忘
  8. C语言中的绝对值函数
  9. 杨澜解读职业女性社区天女网:与电视资源打通
  10. 微信小程序 – 解决腾讯视频插件—视频只能播放广告问题