Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java生成UUID

java生成UUID

作者头像
用户7353950
发布于 2022-05-11 02:38:11
发布于 2022-05-11 02:38:11
1.6K00
代码可运行
举报
文章被收录于专栏:IT技术订阅IT技术订阅
运行总次数:0
代码可运行

1.UUID 简介

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 加密分割区、GNOMEKDE、Mac OS X 等等

2.UUID 组成

UUID保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字 UUID由以下几部分的组合: (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。 (2)时钟序列。 (3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。 UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单地生成UUID, 其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12);

以下是具体生成UUID的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package test;

import java.util.UUID;

public class UUIDGenerator {
    public UUIDGenerator() {
    }

    public static String getUUID() {
        UUID uuid = UUID.randomUUID();
        String str = uuid.toString();
        // 去掉"-"符号
        String temp = str.substring(0, 8) + str.substring(9, 13) + str.substring(14, 18) + str.substring(19, 23) + str.substring(24);
        return str+","+temp;
    }
    //获得指定数量的UUID
    public static String[] getUUID(int number) {
        if (number < 1) {
            return null;
        }
        String[] ss = new String[number];
        for (int i = 0; i < number; i++) {
            ss[i] = getUUID();
        }
        return ss;
    }

    public static void main(String[] args) {
        String[] ss = getUUID(10);
        for (int i = 0; i < ss.length; i++) {
            System.out.println("ss["+i+"]====="+ss[i]);
        }
    }
}

结果:

  1. ss[0]=====4cdbc040-657a-4847-b266-7e31d9e2c3d9,4cdbc040657a4847b2667e31d9e2c3d9
  2. ss[1]=====72297c88-4260-4c05-9b05-d28bfb11d10b,72297c8842604c059b05d28bfb11d10b
  3. ss[2]=====6d513b6a-69bd-4f79-b94c-d65fc841ea95,6d513b6a69bd4f79b94cd65fc841ea95
  4. ss[3]=====d897a7d3-87a3-4e38-9e0b-71013a6dbe4c,d897a7d387a34e389e0b71013a6dbe4c
  5. ss[4]=====5709f0ba-31e3-42bd-a28d-03485b257c94,5709f0ba31e342bda28d03485b257c94
  6. ss[5]=====530fbb8c-eec9-48d1-ae1b-5f792daf09f3,530fbb8ceec948d1ae1b5f792daf09f3
  7. ss[6]=====4bf07297-65b2-45ca-b905-6fc6f2f39158,4bf0729765b245cab9056fc6f2f39158
  8. ss[7]=====6e5a0e85-b4a0-485f-be54-a758115317e1,6e5a0e85b4a0485fbe54a758115317e1
  9. ss[8]=====245accec-3c12-4642-967f-e476cef558c4,245accec3c124642967fe476cef558c4
  10. ss[9]=====ddd4b5a9-fecd-446c-bd78-63b70bb500a1,ddd4b5a9fecd446cbd7863b70bb500a1

  可以看出,UUID 是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字

  UUID由以下几部分的组合:

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

  (2)时钟序列

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

  UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID() UDF进行转换。

  使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显。根据使用的特定机制,UUID不仅需要保证是彼此不相同的,或者最少也是与公元3400年之前其他任何生成的通用惟一标识符有非常大的区别。

  通用惟一标识符还可以用来指向大多数的可能的物体。微软和其他一些软件公司都倾向使用全球惟一标识符(GUID),这也是通用惟一标识符的一种类型,可用来指向组建对象模块对象和其他的软件组件。第一个通用惟一标识符是在网罗计算机系统(NCS)中创建,并且随后成为开放软件基金会(OSF)的分布式计算环境(DCE)的组件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.cib.cap4j.cfn.util;

import java.net.InetAddress;
import java.security.SecureRandom;

/**
 * UUID工具类,用来产生一个唯一的标记号UUID
 */
public class UUIDGenerator {
    private static SecureRandom SEEDER_STATIC = null;
    private static byte[] ADDRESS             = null;
    private static String MID_VALUE_STATIC    = null;
    private String midValue = null;
    private SecureRandom seeder = null;

    static {
        try {
            ADDRESS = InetAddress.getLocalHost().getAddress();
            StringBuffer buffer = new StringBuffer(8);
            buffer.append(toHex(toInt(ADDRESS), 8));
            MID_VALUE_STATIC = buffer.toString();
            SEEDER_STATIC = new SecureRandom();
            SEEDER_STATIC.nextInt();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public UUIDGenerator() {
        StringBuffer buffer = new StringBuffer(16);
        buffer.append(MID_VALUE_STATIC);
        buffer.append(toHex(System.identityHashCode(this), 8));
        midValue = buffer.toString();
        seeder = new SecureRandom();
        seeder.nextInt();
    }

    /**
     * 该方法用来产生一个32位的唯一的标记String
     *
     * @param obj
     *            传入一个参考的对象
     * @return
     */
    public static String generate(Object obj) {
        StringBuffer uid = new StringBuffer(32);

        // get the system time
        long currentTimeMillis = System.currentTimeMillis();
        uid.append(toHex((int) (currentTimeMillis & -1L), 8));

        // get the internet address
        uid.append(MID_VALUE_STATIC);

        // get the object hash value
        uid.append(toHex(System.identityHashCode(obj), 8));

        // get the random number
        uid.append(toHex(getRandom(), 8));

        return uid.toString();
    }

    /**
     * 该方法用来产生一个32位的String唯一标记
     */
    public String generate() {
        StringBuffer uid = new StringBuffer(32);

        // get the system time
        long currentTimeMillis = System.currentTimeMillis();
        uid.append(toHex((int) (currentTimeMillis & -1L), 8));

        // get the internet address
        uid.append(midValue);

        // get the random number
        uid.append(toHex(seeder.nextInt(), 8));

        return uid.toString();
    }

    private static String toHex(int value, int length) {
        char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        StringBuffer buffer = new StringBuffer(length);
        int shift = length - 1 << 2;
        for (int i = -1; ++i < length;) {
            buffer.append(hexDigits[value >> shift & 0xf]);
            value <<= 4;
        }

        return buffer.toString();
    }

    private static int toInt(byte[] bytes) {
        int value = 0;
        for (int i = -1; ++i < bytes.length;) {
            value <<= 8;
            value |= bytes[i];
        }

        return value;
    }

    private static synchronized int getRandom() {
        return SEEDER_STATIC.nextInt();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT技术订阅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
常见的数据库主键选取方式
1、自动增长字段:   自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。这是我们设置主键的首选:
用户7705674
2021/10/07
1.5K0
uuid生成唯一数字_java组件有哪些
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 等等。
全栈程序员站长
2022/11/08
9460
Java 生成 UUID[通俗易懂]
UUID 含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准。
全栈程序员站长
2022/09/16
1.7K0
Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File
java.lang  类 StringBuffer java.lang.Object java.lang.StringBuffer 所有已实现的接口:Serializable, Appendable, CharSequence ---- public final class StringBufferextends Objectimplements Serializable, CharSequence 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意
二十三年蝉
2018/03/01
8470
Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File
Java使用UUID方式随机生成不重复标识
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长
王念博客
2019/07/24
9.7K0
【趣学程序】java常用类(二)
Math类的声明: publicfinalclassMathextendsObjectMath类是与数学计算有关的类,里面的方法都是静态方法,直接使用类名来调用即可。
趣学程序-shaofeer
2019/08/20
4880
Java源码学习之:UUID
作为开发人员大家对UUID应该都比较熟悉了,Java中也提供了相关的类和生成方法,供业务中使用。这里准备对UUID生成的过程做一次深入了解。
程序员架构进阶
2022/01/18
1.7K0
Java源码学习之:UUID
JAVA生成短8位UUID 转
(adsbygoogle = window.adsbygoogle || []).push({});
stys35
2019/04/18
6.2K0
JAVA生成uuid_java接口default方法
我的个人博客开通了,地址:https://timewentby.com 欢迎访问 ###java生成UUID的方法总结
全栈程序员站长
2022/11/09
5420
nodejs 生成8位短id
nodejs版: var uuid = require('uuid'); var shortArray = ["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",
小贝壳
2020/03/05
2.9K0
Java基础(十六):String的常用API
方法二思路:截取前中后三个字符串,中是需要反转的,从新拼接,拼接中字符串时候,从后开始拼接
冬天vs不冷
2025/01/21
760
Java基础(十六):String的常用API
Java工具集-文字(WordUtils)
简单工具类 写作初衷:由于日常开发经常需要用到很多工具类,经常根据需求自己写也比较麻烦 网上好了一些工具类例如commom.lang3或者hutool或者Jodd这样的开源工具,但是 发现他们之中虽然设计不错,但是如果我想要使用,就必须要引入依赖并且去维护依赖,有些 甚至会有存在版本编译不通过问题,故此想要写作一个每个类都可以作为独立工具类使用 每个使用者只需要复制该类,到任何项目当中都可以使用,所以需要尊从以下两个原则才能 做到.在此诚邀各位大佬参与.可以把各自用过的工具,整合成只依赖JDK
cwl_java
2019/10/26
1.2K0
java,获取微信分享需要的获取 signature、jsapi_ticket和access_token
 废话不多,代码说话,那个url是你需要分享的url,需要传进来,然后入参加密。 java,获取微信需要的获取 jsapi_ticket和access_token  @Slf4j @Service public class WeChatServiceImpl implements WeChatService { @Value("${weixin.test.appid}") String appid ; @Value("${weixin.test.sercert}") St
allsmallpig
2021/02/25
1.1K0
java打印数组内容
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/130863.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/11
1.5K0
>> 技术应用:字符串首字母由大写改小写简单方法以及一些思考归纳
这的确是一个锻炼人的方案,可以给予程序员一个思考的空间。我Baidu了一下,这种代码编写方案在自定义工具类StringUtils的比较多,相对应的还有首字母改为大写。
艾特
2023/10/10
2120
>> 技术应用:字符串首字母由大写改小写简单方法以及一些思考归纳
优雅的数据库表ID的设计方案
数据库表设计是项目开发中逃不掉的问题,每一张表,我们都会设计一个ID主键字段,关于表ID的生成方式,每个人都有自己的见解,我们就来讨论如何优雅的设计数据库ID
甲蛙全栈
2020/11/24
1.5K0
java中使用uuid函数_java生成随机数
UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。UUID具有以下涵义:
全栈程序员站长
2022/11/09
1K0
java开发_UUID(Universally Unique Identifier,全局唯一标识符)和GUID(Globally Unique Identifier,全球唯一标识符)
GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) 。
Hongten
2018/09/13
1.2K0
Android中关于UUID的操作
UUID 通用唯一识别码(Universally Unique Identifier)是一种软件建构的标准; UUID的目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不是需要通过中央控制端来做辨识信息的指定。如此以阿里,每个人都可以创建与其他人不冲突的UUID。在这种情况下,就不需要考虑数据库创建时的重复问题; UUID是由一组32位数的16进制数字构成,UUID的标准形式包含32个16进制数字,以连字号分为五段。形式为 8-4-4-12的32个字符。 550e8400-e29b-41d4-a7
佛系编码
2018/05/22
2.4K0
mysql java uuid_Java生成UUID 与 MySQL数据库如何生成uuid数据
UUID 含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准。也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。
全栈程序员站长
2022/11/08
4.9K0
相关推荐
常见的数据库主键选取方式
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验