id生成相关工具类

目录

1.  ID生成器工具类 -- IdUtils

2.  唯一识别码生成 -- UUID


1.  ID生成器工具类 -- IdUtils

/*** ID生成器工具类* */
public class IdUtils
{/*** 获取随机UUID* * @return 随机UUID*/public static String randomUUID(){return UUID.randomUUID().toString();}/*** 简化的UUID,去掉了横线* * @return 简化的UUID,去掉了横线*/public static String simpleUUID(){return UUID.randomUUID().toString(true);}/*** 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID* * @return 随机UUID*/public static String fastUUID(){return UUID.fastUUID().toString();}/*** 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID* * @return 简化的UUID,去掉了横线*/public static String fastSimpleUUID(){return UUID.fastUUID().toString(true);}
}

2.  唯一识别码生成 -- UUID

/*** 提供通用唯一识别码(universally unique identifier)(UUID)实现**/
public final class UUID implements java.io.Serializable, Comparable<UUID>
{private static final long serialVersionUID = -1185015143654744140L;/*** SecureRandom 的单例**/private static class Holder{static final SecureRandom numberGenerator = getSecureRandom();}/** 此UUID的最高64有效位 */private final long mostSigBits;/** 此UUID的最低64有效位 */private final long leastSigBits;/*** 私有构造* * @param data 数据*/private UUID(byte[] data){long msb = 0;long lsb = 0;assert data.length == 16 : "data must be 16 bytes in length";for (int i = 0; i < 8; i++){msb = (msb << 8) | (data[i] & 0xff);}for (int i = 8; i < 16; i++){lsb = (lsb << 8) | (data[i] & 0xff);}this.mostSigBits = msb;this.leastSigBits = lsb;}/*** 使用指定的数据构造新的 UUID。** @param mostSigBits 用于 {@code UUID} 的最高有效 64 位* @param leastSigBits 用于 {@code UUID} 的最低有效 64 位*/public UUID(long mostSigBits, long leastSigBits){this.mostSigBits = mostSigBits;this.leastSigBits = leastSigBits;}/*** 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的本地线程伪随机数生成器生成该 UUID。* * @return 随机生成的 {@code UUID}*/public static UUID fastUUID(){return randomUUID(false);}/*** 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。* * @return 随机生成的 {@code UUID}*/public static UUID randomUUID(){return randomUUID(true);}/*** 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。* * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能* @return 随机生成的 {@code UUID}*/public static UUID randomUUID(boolean isSecure){final Random ng = isSecure ? Holder.numberGenerator : getRandom();byte[] randomBytes = new byte[16];ng.nextBytes(randomBytes);randomBytes[6] &= 0x0f; /* clear version */randomBytes[6] |= 0x40; /* set to version 4 */randomBytes[8] &= 0x3f; /* clear variant */randomBytes[8] |= 0x80; /* set to IETF variant */return new UUID(randomBytes);}/*** 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。** @param name 用于构造 UUID 的字节数组。** @return 根据指定数组生成的 {@code UUID}*/public static UUID nameUUIDFromBytes(byte[] name){MessageDigest md;try{md = MessageDigest.getInstance("MD5");}catch (NoSuchAlgorithmException nsae){throw new InternalError("MD5 not supported");}byte[] md5Bytes = md.digest(name);md5Bytes[6] &= 0x0f; /* clear version */md5Bytes[6] |= 0x30; /* set to version 3 */md5Bytes[8] &= 0x3f; /* clear variant */md5Bytes[8] |= 0x80; /* set to IETF variant */return new UUID(md5Bytes);}/*** 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。** @param name 指定 {@code UUID} 字符串* @return 具有指定值的 {@code UUID}* @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常**/public static UUID fromString(String name){String[] components = name.split("-");if (components.length != 5){throw new IllegalArgumentException("Invalid UUID string: " + name);}for (int i = 0; i < 5; i++){components[i] = "0x" + components[i];}long mostSigBits = Long.decode(components[0]).longValue();mostSigBits <<= 16;mostSigBits |= Long.decode(components[1]).longValue();mostSigBits <<= 16;mostSigBits |= Long.decode(components[2]).longValue();long leastSigBits = Long.decode(components[3]).longValue();leastSigBits <<= 48;leastSigBits |= Long.decode(components[4]).longValue();return new UUID(mostSigBits, leastSigBits);}/*** 返回此 UUID 的 128 位值中的最低有效 64 位。** @return 此 UUID 的 128 位值中的最低有效 64 位。*/public long getLeastSignificantBits(){return leastSigBits;}/*** 返回此 UUID 的 128 位值中的最高有效 64 位。** @return 此 UUID 的 128 位值中最高有效 64 位。*/public long getMostSignificantBits(){return mostSigBits;}/*** 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。* <p>* 版本号具有以下含意:* <ul>* <li>1 基于时间的 UUID* <li>2 DCE 安全 UUID* <li>3 基于名称的 UUID* <li>4 随机生成的 UUID* </ul>** @return 此 {@code UUID} 的版本号*/public int version(){// Version is bits masked by 0x000000000000F000 in MS longreturn (int) ((mostSigBits >> 12) & 0x0f);}/*** 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。* <p>* 变体号具有以下含意:* <ul>* <li>0 为 NCS 向后兼容保留* <li>2 <a href="http://www.ietf.org/rfc/rfc4122.txt">IETF&nbsp;RFC&nbsp;4122</a>(Leach-Salz), 用于此类* <li>6 保留,微软向后兼容* <li>7 保留供以后定义使用* </ul>** @return 此 {@code UUID} 相关联的变体号*/public int variant(){// This field is composed of a varying number of bits.// 0 - - Reserved for NCS backward compatibility// 1 0 - The IETF aka Leach-Salz variant (used by this class)// 1 1 0 Reserved, Microsoft backward compatibility// 1 1 1 Reserved for future definition.return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63));}/*** 与此 UUID 相关联的时间戳值。** <p>* 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。<br>* 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。** <p>* 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。<br>* 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。** @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。*/public long timestamp() throws UnsupportedOperationException{checkTimeBase();return (mostSigBits & 0x0FFFL) << 48//| ((mostSigBits >> 16) & 0x0FFFFL) << 32//| mostSigBits >>> 32;}/*** 与此 UUID 相关联的时钟序列值。** <p>* 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。* <p>* {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出* UnsupportedOperationException。** @return 此 {@code UUID} 的时钟序列** @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1*/public int clockSequence() throws UnsupportedOperationException{checkTimeBase();return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48);}/*** 与此 UUID 相关的节点值。** <p>* 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。* <p>* 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。<br>* 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。** @return 此 {@code UUID} 的节点值** @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1*/public long node() throws UnsupportedOperationException{checkTimeBase();return leastSigBits & 0x0000FFFFFFFFFFFFL;}/*** 返回此{@code UUID} 的字符串表现形式。** <p>* UUID 的字符串表示形式由此 BNF 描述:* * <pre>* {@code* UUID                   = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node>* time_low               = 4*<hexOctet>* time_mid               = 2*<hexOctet>* time_high_and_version  = 2*<hexOctet>* variant_and_sequence   = 2*<hexOctet>* node                   = 6*<hexOctet>* hexOctet               = <hexDigit><hexDigit>* hexDigit               = [0-9a-fA-F]* }* </pre>* * </blockquote>** @return 此{@code UUID} 的字符串表现形式* @see #toString(boolean)*/@Overridepublic String toString(){return toString(false);}/*** 返回此{@code UUID} 的字符串表现形式。** <p>* UUID 的字符串表示形式由此 BNF 描述:* * <pre>* {@code* UUID                   = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node>* time_low               = 4*<hexOctet>* time_mid               = 2*<hexOctet>* time_high_and_version  = 2*<hexOctet>* variant_and_sequence   = 2*<hexOctet>* node                   = 6*<hexOctet>* hexOctet               = <hexDigit><hexDigit>* hexDigit               = [0-9a-fA-F]* }* </pre>* * </blockquote>** @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串* @return 此{@code UUID} 的字符串表现形式*/public String toString(boolean isSimple){final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36);// time_lowbuilder.append(digits(mostSigBits >> 32, 8));if (false == isSimple){builder.append('-');}// time_midbuilder.append(digits(mostSigBits >> 16, 4));if (false == isSimple){builder.append('-');}// time_high_and_versionbuilder.append(digits(mostSigBits, 4));if (false == isSimple){builder.append('-');}// variant_and_sequencebuilder.append(digits(leastSigBits >> 48, 4));if (false == isSimple){builder.append('-');}// nodebuilder.append(digits(leastSigBits, 12));return builder.toString();}/*** 返回此 UUID 的哈希码。** @return UUID 的哈希码值。*/@Overridepublic int hashCode(){long hilo = mostSigBits ^ leastSigBits;return ((int) (hilo >> 32)) ^ (int) hilo;}/*** 将此对象与指定对象比较。* <p>* 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。** @param obj 要与之比较的对象** @return 如果对象相同,则返回 {@code true};否则返回 {@code false}*/@Overridepublic boolean equals(Object obj){if ((null == obj) || (obj.getClass() != UUID.class)){return false;}UUID id = (UUID) obj;return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits);}// Comparison Operations/*** 将此 UUID 与指定的 UUID 比较。** <p>* 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。** @param val 与此 UUID 比较的 UUID** @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。**/@Overridepublic int compareTo(UUID val){// The ordering is intentionally set up so that the UUIDs// can simply be numerically compared as two numbersreturn (this.mostSigBits < val.mostSigBits ? -1 : //(this.mostSigBits > val.mostSigBits ? 1 : //(this.leastSigBits < val.leastSigBits ? -1 : //(this.leastSigBits > val.leastSigBits ? 1 : //0))));}// -------------------------------------------------------------------------------------------------------------------// Private method start/*** 返回指定数字对应的hex值* * @param val 值* @param digits 位* @return 值*/private static String digits(long val, int digits){long hi = 1L << (digits * 4);return Long.toHexString(hi | (val & (hi - 1))).substring(1);}/*** 检查是否为time-based版本UUID*/private void checkTimeBase(){if (version() != 1){throw new UnsupportedOperationException("Not a time-based UUID");}}/*** 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG)* * @return {@link SecureRandom}*/public static SecureRandom getSecureRandom(){try{return SecureRandom.getInstance("SHA1PRNG");}catch (NoSuchAlgorithmException e){throw new UtilException(e);}}/*** 获取随机数生成器对象<br>* ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。* * @return {@link ThreadLocalRandom}*/public static ThreadLocalRandom getRandom(){return ThreadLocalRandom.current();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/690115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一次失败的面试经历:我只想找个工作,你却用面试题羞辱我

金三银四就要来了&#xff0c;即将又是一波求职月&#xff0c;面对跳槽的高峰期&#xff0c;很多软件测试人员都希望能拿一个满意的高薪offer&#xff0c;但是随着招聘职位的不断增多&#xff0c;面试的难度也随之加大&#xff0c;而面试官更是会择优录取 小王最近为面试已经焦…

Docker 数据卷

Docker 数据卷 一、介绍二、数据卷的使用1 添加数据卷2 只读权限数据卷 一、介绍 数据卷就是目录或文件&#xff0c;用来与宿主机/容器共享数据的。 数据卷的生命周期一直持续到没有容器使用它为止。 二、数据卷的使用 1 添加数据卷 运行一个centos容器是直接添加 docker …

循环测试之旅 —— 深度解析Pytest插件 pytest-repeat!

在软件开发中&#xff0c;测试的重要性不言而喻。而为了提高测试的鲁棒性和可靠性&#xff0c;Pytest插件 pytest-repeat 应运而生。这个插件可以帮助你轻松实现测试用例的循环运行&#xff0c;以更全面地评估代码的稳定性。本文将深入介绍 pytest-repeat 插件的基本用法和实际…

msvcp140.dll丢失要怎么处理的一些解决方法,分享一些解决办法

在Windows操作系统中&#xff0c;有时候我们会遇到一些dll文件丢失或损坏的问题。其中一个常见的错误是"找不到msvcp140.dll"。这个错误会导致一些应用程序无法正常运行&#xff0c;给我们的电脑使用带来了很大的困扰。不用担心&#xff0c;今天我们就来说说由于找不…

OpenAI视频生成模型Sora的全面解析:从ViViT、扩散Transformer到NaViT、VideoPoet

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发(详见《视频生成发展史&#xff1a;从Gen2、Emu Video到PixelDance、SVD、Pika 1.0、W.A.L.T》)才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…

Java自旋锁

概念 自旋锁&#xff08;Spinlock&#xff09;是一种特殊的锁&#xff0c;用于解决多线程同步问题。与常规锁&#xff08;如synchronized关键字或ReentrantLock&#xff09;不同&#xff0c;自旋锁在尝试获取锁时&#xff0c;如果锁已经被其他线程持有&#xff0c;那么当前线程…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_4

《剑指Offer》笔记&题解&思路&技巧&优化_Part_4 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. LCR 148. 验证图书取出顺序——栈的压入、弹出序列2. LCR 14…

简单贪吃蛇模拟(C语言版本·)

简单贪吃蛇模拟&#xff08;C语言版本&#xff09; 一、所需win32 API知识二、游戏逻辑实现 一、所需win32 API知识 1.在这儿&#xff0c;直接弱化概念&#xff0c;把在贪吃蛇中用到的API知识说一下&#xff01;  1.1用cmd命令来设置控制台窗口的长宽   1.2.用title 指令…

如何使用Pycharm中的image模块以及导入打开图片(属性)

在学习pytorch深度学习的过程中&#xff0c;通常会使用到大量的数据集&#xff0c;包括训练集和测试集。 以下是pytorch加载数据集的流程&#xff1a; 在notebook中使用help方法查看Dataset类的功能以及操作&#xff1a; 使用dataset需要继承Dataset父类 重写__getitem__方法和…

Android使用shape定义带渐变色的背景

在drawable目录下创建文件bg_gradient.xml 文件内的内容如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <shape android:shape"rectangle" xmlns:android"http://schemas.android.com/apk/res/android"> <…

更换笔记本电脑内存条

写在前头 本人笔记本电脑早年购买&#xff0c;随着学习工作量的增大&#xff0c;我在使用电脑时往往需要同时打开多个软件&#xff0c;这时电脑的表现就难以言论了。虽然这个电脑在我的手中表现出其“志在千里”的鸿志&#xff08;毕竟它主人是谁里&#xff09;&#xff0c;但…

前端秘法基础式(CSS)(第二卷)

目录 一.字体 1.字体的设置 2.字体的颜色 2.1预定义的颜色值 2.2十六进制 2.3rgb表示法 3.字体粗细及样式 4.文本 4.1text-align 4.2text-indent 4.3text-decoration 二.背景属性 三.圆角矩形 四.元素显示模式 五.盒模型 六.弹性布局 七.Chrome调试工具 一.字…

普通人steam搬砖到底能不能做,一定谨记这4点

steam/csgo搬砖项目拥有小投资收益稳定的特点&#xff0c;多搬多赚&#xff0c;这个项目已存在很多年&#xff0c;是非常老牌的阳光项目&#xff0c;很多人比较关心普通人steam搬砖到底能不能做&#xff0c;这里想提醒你谨记这4点。 1&#xff1a;steam/csgo搬砖项目不需要玩游…

java.sql.SQLException: No operations allowed after statement closed.

背景 某天下午&#xff0c;客服反馈线上服务出现问题&#xff0c;不能分配了。于是我登录到系统上&#xff0c;进行同样的操作发现也不行。当然同时我已经登录到服务器打开了日志&#xff0c;发现报错了&#xff0c;下面就是日志的错误信息&#xff1a; java.sql.SQLExceptio…

AI嵌入式K210项目(29)-模型加载

文章目录 前言一、下载部署包二、C部署三、搭建文件传输环境四、文件传输五、调试六、MicroPython部署总结 前言 上一章节介绍了如何进行在线模型训练&#xff0c;生成部署包后&#xff0c;本章介绍加载模型&#xff1b; 一、下载部署包 训练结束后&#xff0c;在训练任务条…

5 虚拟存储器

常规存储器管理方式和局部性原理 特征&#xff1a;一次性 驻留性局部性原理&#xff1a;较短的时间内程序的执行仅局限于某个部分 时间局限性&#xff1a;最近访问过的又被访问&#xff08;循环操作&#xff09;空间局限性&#xff1a;程序顺序执行 虚拟存储器&#xff1a;进程…

基于ESP32+Platformio的物联网RTOS_SDK-CC_Device

本项目基于ESP32以及Platformio平台开发&#xff0c;请自行查阅如何配置这个环境 开源gitee地址&#xff1a;cc_smart_device 如果愿意贡献项目or提出疑问和修改的&#xff0c;请在gitee上提issue 项目里的mqtt服务器是公共的 请大家最好换成私有的 否则容易收到其他用户的错误…

mybatis 基础入门使用

1、mybatis 简介 1.1、mybatis 特性 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架&#xff1b; MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集&#xff1b; MyBatis可以使用简单的XML或注解用于配置和原始映射&#xff0c;将接口和…

【Java面试】MongoDB

目录 1、mongodb是什么&#xff1f;2、mongodb特点什么是NoSQL数据库&#xff1f;NoSQL和RDBMS有什么区别&#xff1f;在哪些情况下使用和不使用NoSQL数据库&#xff1f;NoSQL数据库有哪些类型?启用备份故障恢复需要多久什么是master或primary什么是secondary或slave系列文章版…

【shell】2、Makefile

文章目录 一、变量1.1 定义简单变量1.2 定义数组1.3 引用变量1.4 规则中定义变量 一、变量 1.1 定义简单变量 用变量名 值的语法来定义变量。这些变量可以用于存储命令、文件名、目录路径等信息&#xff0c;以便在Makefile规则中重复使用 # 定义一个变量 VAR_NAME value# …