Java生成Long类型唯一ID的方法

Java生成Long类型唯一ID的方法如题 在数据库 insert 场景下 有时我们需要生成整型唯一 ID 一般来说 ID 让数据库自动生成比较好 但不排除有些时候需要手动 或者其他的使用场景需要唯一数 在 Java 中 我们可以通过如下方式来做

大家好,欢迎来到IT知识分享网。

如题,在数据库insert场景下,有时我们需要生成整型唯一ID。一般来说,ID让数据库自动生成比较好,但不排除有些时候需要手动。或者其他的使用场景需要唯一数。

Java中,我们可以通过如下方式来做。

基于时间戳和原子操作

直接上代码示例

public class IdGenerator { private static final AtomicLong id = new AtomicLong(System.currentTimeMillis()); public static synchronized long generateId() { long current = id.get(); if (current == System.currentTimeMillis()) { id.incrementAndGet(); } else { id.set(System.currentTimeMillis()); } return id.get(); } public static void main(String[] args) { long id = generateId(); System.out.println("Generated ID: " + id); } }

优点:生成简单,性能高,适用于单体应用。

缺点:在分布式环境下可能需要额外的同步机制。

这种方式足以应对大部分场景了。

基于`UUID`的`Long`类型转换

生成UUID大家都熟吧,其实也可以基于这种方式来生成随机数。看例子

public class IdGenerator { public static long generateId() { UUID uuid = UUID.randomUUID(); long mostSigBits = uuid.getMostSignificantBits(); long leastSigBits = uuid.getLeastSignificantBits(); return (mostSigBits ^ leastSigBits); } public static void main(String[] args) { long id = generateId(); System.out.println("Generated ID: " + id); } }

用UUID高低位异或生成随机数,使用起来也很简单。

优点:生成简单,全局唯一性高。

缺点:长度较长(32位),存储和检索效率较低。

分布式系统——Snowflake

前面介绍的方式在分布式系统中存在重复的概率,为了万无一失,只能引入更复杂的控制机制

public class IdGenerator { private static final SnowflakeIdWorker idWorker = new SnowflakeIdWorker(1, 1); // 数据中心ID和机器ID根据实际情况配置 public static long generateId() { return idWorker.nextId(); } public static void main(String[] args) { long id = generateId(); System.out.println("Generated Snowflake ID: " + id); } }

原理:Snowflake算法生成的ID是64位的长整型数字,包含时间戳、数据中心ID、机器ID和序列号。

优点:生成的ID有序、全局唯一,适合分布式系统。

缺点:需要配置数据中心ID和机器ID,时钟回退可能导致ID重复。

以上就是几种生成Long类型唯一ID的方法。不过话说回来,真遇到这种场景时,首先考虑一下系统设计是否合理,应尽量避免这种情况出现。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/183105.html

(0)
上一篇 2025-07-12 12:10
下一篇 2025-07-12 12:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信