JAVA UUID 生成唯一标识

需求

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

<font size="4">     65752c66-bd3f-4564-b8d6-92d66796e007</font>

 

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

 

获取八位UUID标识码

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<font size="4">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(); 

    }  </font>

 

 

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

时间: 2024-12-30 07:58:22

JAVA UUID 生成唯一标识的相关文章

JAVA UUID 生成

GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复. UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID package com.mytest; import java.util.UUID; public class UTest {    public static void main(S

java如何对一个字符串生成唯一的编码

问题描述 如题.比如我有很多字符串,有中文也有英文字母符号之类的.而且每天字符串的数量都可能有更新.如何能够给不同的字符串生成一个唯一的编码? 解决方案 解决方案二:将字符串生成MD5保证能唯一.解决方案三:引用1楼yu2002fu的回复: 将字符串生成MD5保证能唯一. 代码如何实现,可以举个例子吗?解决方案四:importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;publicclassmd

Python用UUID库生成唯一ID的方法示例_python

UUID介绍 UUID是128位的全局唯一标识符,通常由32字节的字符串表示.它可以保证时间和空间的唯一性,也称为GUID,全称为:UUID -- Universally Unique IDentifier,Python 中叫 UUID. 它通过MAC地址.时间戳.命名空间.随机数.伪随机数来保证生成ID的唯一性. UUID主要有五个算法,也就是五种方法来实现. uuid1()--基于时间戳.由MAC地址.当前时间戳.随机数生成.可以保证全球范围内的唯一性,但MAC的使用同时带来安全性问题,局域

获取Android设备唯一标识码

概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一性并不理想.而通过其他硬件信息标识也因为系统版本.手机硬件等限制存在不同程度的问题. 下面收集了一些"有能力"或"有一定能力"作为设备标识的串码. DEVICE_ID 这是Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有

浅谈android获取设备唯一标识完美解决方案

本文介绍了浅谈android获取设备唯一标识完美解决方案,分享给大家,具体如下: /** * deviceID的组成为:渠道标志+识别符来源标志+hash后的终端识别符 * * 渠道标志为: * 1,andriod(a) * * 识别符来源标志: * 1, wifi mac地址(wifi): * 2, IMEI(imei): * 3, 序列号(sn): * 4, id:随机码.若前面的都取不到时,则随机生成一个随机码,需要缓存. * * @param context * @return */ p

spring mvc-Java SpringMVC web项目如何获取手机的唯一标识

问题描述 Java SpringMVC web项目如何获取手机的唯一标识 想做一个web手机签到系统,为了防止同学用其他同学的手机签到,所以要记住每个同学手机的. 签到的基本流程是同学用手机连上特定的wifi,然后用手机浏览器登陆某个局域网IP,在出来的页面那里签到. 唯一标识(mac地址或者IMEI之类的),这样这个同学就只能用这台手机签到了. 那么问题来了?请问如何在java后台通过HttpServletRequest或者其他方法获取到手机的唯一标识,而且所有手机都是连上了同一个路由器的局域

iOS获取设备唯一标识的8种方法_IOS

8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可以改变设备的 UDID),移动网络可以利用 UDID 来识别移动设备. 许多开发者把 UDID 跟用户的真实姓名.密码.住址.其它数据关联起来,网络窥探者会从多个应用收集这些数据,然后顺藤摸瓜得到这个人的许多隐私数据,同时大部分应用确实在频繁传输 UDID 和私人信息. 为了避免集体诉讼,苹果最终决

php生成唯一数字id的方法汇总_php技巧

关于生成唯一数字ID的问题,是不是需要使用rand生成一个随机数,然后去数据库查询是否有这个数呢?感觉这样的话有点费时间,有没有其他方法呢? 当然不是,其实有两种方法可以解决. 1. 如果你只用php而不用数据库的话,那时间戳+随机数是最好的方法,且不重复: 2. 如果需要使用数据库,即你还需要给这个id关联一些其他的数据.那就给MySQL数据库中的表的id一个AUTO_INCREMENT(自增)属性,每次插入一条数据时,id自动+1,然后使用mysql_insert_id()或LAST_INS

PHP生成唯一ID之SnowFlake算法_php实例

前言:最近需要做一套CMS系统,由于功能比较单一,而且要求灵活,所以放弃了WP这样的成熟系统,自己做一套相对简单一点的.文章的详情页URL想要做成url伪静态的格式即xxx.html 其中xxx考虑过直接用自增主键,但是感觉这样有点暴露文章数量,有同学说可以把初始值设高一点,可是还是可以通过ID差算出一段时间内的文章数量,所以需要一种可以生成唯一ID的算法. 考虑过的方法有 直接用时间戳,或者以此衍生的一系列方法 Mysql自带的uuid 以上两种方法都可以查到就不多做解释了 最终选择了Twit