前言
在项目工程中我们常常会遇到需要标识某种行为、某种操作、某个工单,从头到尾的串联起来。这个时候,我们在实际工作中会用到唯一ID概念。唯一ID要具有唯一性,不可重复,那么在实际工作中我们应该怎么选择我们的唯一ID呢?
以下我会列举几类唯一ID,并附上代码实现。会简单的说一下唯一ID的使用场景。
环境依赖
先在代码中加个依赖,主要演示语言为Java。
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.15</version> </dependency>
唯一ID
uuid
使用uuid作为唯一ID, UUID 含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准。uuid的组成有3个部分当前日期和时间、时钟序列、全局唯一的IEEE机器识别号。
代码实现:
public static void getUuid() { System.out.println("uuid:" + IdUtil.simpleUUID()); }
结果如下:
uuid作为唯一ID虽然不会重复,作为分布式系统中的唯一ID也可以。只是uuid比较长,而且没有什么属性信息。一些比较临时数据和业务的场景,采用uuid是没什么问题的。
雪花算法
目前雪花算法生成的ID已经慢慢成为趋势,它是一个64bit大小的整数,主要结构图如下:
代码实现:
package com.huyi.csdn.tools; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; import java.util.Random; /** * @Program: csdn @ClassName: IdDemo @Author: huyi @Date: 2021-12-08 21:16 @Description: * 唯一id @Version: V1.0 */ public class IdDemo { public static final Snowflake snowFlake = new Snowflake(1, 2); private static Random random = new Random(); public static void getSnowFlake() { Long uid = null; for (int i = 0; i < random.nextInt(2) + 1; i++) { uid = snowFlake.nextId(); } System.out.println("snowflake:" + uid); } public static void main(String[] args) { getSnowFlake(); } }
看下结果:
代码部分为什么需要使用随机取nextId呢?主要是因为避免一直为偶数。雪花算法生成的ID除了唯一性的好处之外,还具有自增性。所以雪花ID易于存在数据库中,在内存中性能也挺好的。所以博主也非常推荐在工作项目中使用雪花id。
ObjectId
ObjectId是MongoDB数据库的一种唯一ID生成策略,它是UUID version1的变种。
代码实现:
public static void getObjectId() { System.out.println("objectId:" + IdUtil.objectId()); }
看下结果:
优点是比uuid短一些,使用场景基本和uuid一致。
时间戳
精确到毫秒的时间戳其实还是会有不唯一的可能,但是它具备其他唯一ID不具备的属性特性。可以在查看日志的时候,通过时间戳判断该业务或者工单的发起时间。
代码实现:
public static void getTimestamp() { System.out.println("timestamp:" + System.currentTimeMillis()); }
看下结果:
在高并发的场景下,不建议使用时间戳作为ID,可以考虑和其他唯一ID做组合,让ID具备时间属性。
完整代码
package com.huyi.csdn.tools; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; import java.util.Random; /** * @Program: csdn @ClassName: IdDemo @Author: huyi @Date: 2021-12-08 21:16 @Description: * 唯一id @Version: V1.0 */ public class IdDemo { public static final Snowflake snowFlake = new Snowflake(1, 2); private static Random random = new Random(); public static void getUuid() { System.out.println("uuid:" + IdUtil.simpleUUID()); } public static void getSnowFlake() { Long uid = null; for (int i = 0; i < random.nextInt(2) + 1; i++) { uid = snowFlake.nextId(); } System.out.println("snowflake:" + uid); } public static void getObjectId() { System.out.println("objectId:" + IdUtil.objectId()); } public static void getTimestamp() { System.out.println("timestamp:" + System.currentTimeMillis()); } public static void main(String[] args) { getUuid(); getSnowFlake(); getObjectId(); getTimestamp(); } }
总结
唯一ID的使用还是需要看具体的场景,主要还是推荐雪花算法,作为long类型,还可以取模使用。
分享:
无论如何思念,也有些东西终究无法企及,那么,忘了就好。——《夏目友人帐》
如果本文对你有帮助的话,给个赞吧,谢谢!