当前位置: 首页 > news >正文

JAVA UUID 生成唯一标识

Reprint it anywhere u want

需求

    项目在设计表的时候,要处理并发多的一些数据,类似订单号不能重复,要保持唯一。原本以为来个时间戳,精确到毫秒应该不错了。后来觉得是错了,测试环境下很多一样的ID,不能达到唯一标识。

UUID

    JDK API 是这么说的:
“表示通用唯一标识符 (UUID) 的类。 UUID 表示一个 128 位的值。”

    详细的说就是:
“UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft’s Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。”

 

UUID由以下几部分的组合:   

(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。   

(2)时钟序列   

(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

 

代码实现

    很方便的,直接调用UUID的randomUUID方法,即可获得UUID对象,然后就获取了这个唯一标识码。

?
1
2
3
4
5
public static void main(String[] args)
{
     UUID uuid = UUID.randomUUID();
     System.out.println(uuid);
}

    RUN一下,可以从控制台发现:

?
1
65752c66-bd3f-4564-b8d6-92d66796e007

    这就是唯一标志码。但显得冗长,不够友好。如果在URL后面做参数,更加不够友好。还有存储一个UUID要花费更多的空间。获取的时间倒不必考虑太多。

 

获取八位UUID标识码

仿着网上大牛代码,直接上代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static String[] chars = new String[]
         {
             "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
             "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
             "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V","W", "X", "Y", "Z"
         }; 
 
 
     public static String getShortUuid()
    
         StringBuffer stringBuffer = new StringBuffer(); 
         String uuid = UUID.randomUUID().toString().replace("-", ""); 
         for (int i = 0; i < 8; i++)
        
             String str      = uuid.substring(i * 4, i * 4 + 4); 
             int strInteger  = Integer.parseInt(str, 16); 
             stringBuffer.append(chars[strInteger % 0x3E]); 
        
         
         return stringBuffer.toString(); 
     }

 

用300个测试下,没问题。足够用了,能适应环境场景即可。

 

相关文章:

  • 网络开发的最强大框架:Netty快速入门
  • 适配器模式详解与应用
  • 树莓派 - 使用须知
  • 粘包和半包有了解过吗?netty是如何解决这个问题的
  • 云计算与SOA之我见
  • 迭代器模式:理解与实践
  • [转]MySQL排序原理与案例分析
  • 深入浅出CMS垃圾收集器
  • php.ini中的session配置说明
  • 如何上传自己的jar包到maven中央仓库(2021最新版)
  • ElasticSearch聚合查询Restful语法和JavaApi详解(基于ES7.6)
  • 《偷影子的人》
  • 模板方法设计模式理论与应用
  • 跟我一起数据挖掘(13)——矩阵分解
  • 用了MybatisPlus后,我很久没有手写sql了
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【node学习】协程
  • es6
  • JAVA并发编程--1.基础概念
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Mybatis初体验
  • node学习系列之简单文件上传
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • REST架构的思考
  • vue自定义指令实现v-tap插件
  • 从tcpdump抓包看TCP/IP协议
  • 关于springcloud Gateway中的限流
  • 两列自适应布局方案整理
  • 设计模式走一遍---观察者模式
  • 说说动画卡顿的解决方案
  • 思否第一天
  • 思维导图—你不知道的JavaScript中卷
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 我看到的前端
  • 学习使用ExpressJS 4.0中的新Router
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​​​​​​​​​​​​​​Γ函数
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • (C语言)二分查找 超详细
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (三)终结任务
  • (十六)一篇文章学会Java的常用API
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)C#调用WebService 基础
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET 服务 ServiceController
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET牛人应该知道些什么(2):中级.NET开发人员