0
点赞
收藏
分享

微信扫一扫

java根据时间生成唯一id

Java根据时间生成唯一ID的方法

在实际的软件开发中,生成唯一的ID是一项非常常见的任务。这些唯一的ID在数据库操作、分布式系统、消息队列等领域都有广泛的应用。本文将介绍一种基于Java的方法,通过时间戳生成唯一的ID。

时间戳

时间戳是指从某个固定日期(通常是1970年1月1日)到目前时间的毫秒数。在Java中,可以通过System.currentTimeMillis()方法获取当前的时间戳。

long timestamp = System.currentTimeMillis();
System.out.println("当前时间戳:" + timestamp);

输出结果:

当前时间戳:1645678901234

基于时间戳生成ID

基于时间戳生成唯一ID的方法是将时间戳与一个自增的序列号相结合。这样可以保证在同一毫秒内生成的ID是唯一的。

public class UniqueIdGenerator {
    private static final long START_TIMESTAMP = 1645678900000L; // 设置起始时间戳
    private static long lastTimestamp = -1L;
    private static long sequence = 0L;

    public synchronized static long generateId() {
        long currentTimestamp = System.currentTimeMillis();
        if (currentTimestamp < lastTimestamp) {
            throw new RuntimeException("时间戳倒退错误");
        }

        if (currentTimestamp == lastTimestamp) {
            sequence = (sequence + 1) & 4095; // 序列号取值范围为0~4095
            if (sequence == 0) {
                currentTimestamp = waitNextMillis(currentTimestamp);
            }
        } else {
            sequence = 0;
        }

        lastTimestamp = currentTimestamp;
        return ((currentTimestamp - START_TIMESTAMP) << 12) | sequence;
    }

    private static long waitNextMillis(long currentTimestamp) {
        long timestamp = System.currentTimeMillis();
        while (timestamp <= currentTimestamp) {
            timestamp = System.currentTimeMillis();
        }
        return timestamp;
    }
}

上述代码中,我们使用了一个静态变量lastTimestamp来保存上次生成ID的时间戳,sequence用于记录序列号。当生成ID时,如果当前时间戳与上次时间戳相同,则自增序列号,如果序列号达到最大值,则等待下一毫秒再生成。

测试生成ID

我们来测试一下生成唯一ID的方法:

public class UniqueIdGeneratorTest {
    public static void main(String[] args) {
        long id1 = UniqueIdGenerator.generateId();
        long id2 = UniqueIdGenerator.generateId();
        System.out.println("ID1: " + id1);
        System.out.println("ID2: " + id2);
    }
}

输出结果:

ID1: 17179869184
ID2: 17179869185

总结

通过以上方法,我们可以根据时间戳生成唯一的ID。这种方法的优点是简单易懂,并且不依赖于外部数据库或服务。但是需要注意的是,如果在同一毫秒内生成的ID数超过4096个,就会出现ID冲突的情况,因此在高并发的场景下可能需要采用其他方法。

参考资料

  • Java API Documentation: [System.currentTimeMillis()](
  • Stack Overflow: [How to create a unique ID in java?](

数学公式:

该方法生成的ID公式如下所示:

ID = ((currentTimestamp - START_TIMESTAMP) << 12) | sequence

流程图:

st=>start: 开始
e=>end: 结束
op1=>operation: 生成唯一ID
cond1=>condition: 当前时间戳是否小于上次时间戳?
cond2=>condition: 序列号是否达到最大值?
op2=>operation: 等待下一毫秒
op3=>operation: 自增序列号
op4=>operation: 更新上次时间戳
out=>operation: 输出唯一ID

st->cond1
cond1(yes)->cond2
cond1(no)->op3->op4->out->e
cond2(yes)->op2->cond1
cond2(no)->op4->out->e

以上就是使用Java根据时间生成唯

举报

相关推荐

0 条评论