Snowflake算法是Twitter开源的分布式唯一ID生成算法,通过生成64位的唯一ID,其中包括41位的时间戳,10位的机器ID和12位的序列号。
要在Java中使用Snowflake算法,首先需要实现一个Snowflake类来生成唯一ID。以下是一个简单的示例代码:
public class Snowflake { private final long workerId; private final static long START_TIMESTAMP = 1577808000000L; // 2020-01-01 private long sequence = 0L; private final static long WORKER_ID_BITS = 5L; private final static long MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS); private final static long SEQUENCE_BITS = 12L; private final static long WORKER_ID_SHIFT = SEQUENCE_BITS; private final static long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS; private final static long SEQUENCE_MASK = -1L ^ (-1L << SEQUENCE_BITS); private long lastTimestamp = -1L; public Snowflake(long workerId) { if (workerId > MAX_WORKER_ID || workerId < 0) { throw new IllegalArgumentException(String.format("Worker ID must be between 0 and %d", MAX_WORKER_ID)); } this.workerId = workerId; } public synchronized long nextId() { long timestamp = System.currentTimeMillis(); if (timestamp < lastTimestamp) { throw new RuntimeException("Clock moved backwards. Refusing to generate id"); } if (timestamp == lastTimestamp) { sequence = (sequence + 1) & SEQUENCE_MASK; if (sequence == 0) { timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = timestamp; return ((timestamp - START_TIMESTAMP) << TIMESTAMP_SHIFT) | (workerId << WORKER_ID_SHIFT) | sequence; } private long tilNextMillis(long lastTimestamp) { long timestamp = System.currentTimeMillis(); while (timestamp <= lastTimestamp) { timestamp = System.currentTimeMillis(); } return timestamp; } public static void main(String[] args) { Snowflake snowflake = new Snowflake(1); System.out.println(snowflake.nextId()); } }
在main方法中,创建一个Snowflake对象,然后调用nextId方法就可以生成唯一ID。可以根据需要调整START_TIMESTAMP、WORKER_ID_BITS和SEQUENCE_BITS等参数。