diff --git a/panda-jdbc/src/main/java/org/panda/jdbc/id/IdGenerate.java b/panda-jdbc/src/main/java/org/panda/jdbc/id/IdGenerate.java new file mode 100644 index 0000000..e4a90d8 --- /dev/null +++ b/panda-jdbc/src/main/java/org/panda/jdbc/id/IdGenerate.java @@ -0,0 +1,14 @@ +package org.panda.jdbc.id; + +/** + * 数据库主键ID生成器 + * @author qi + */ +public interface IdGenerate { + + /** + * + * @return 主键ID + */ + T nextId(); +} diff --git a/panda-jdbc/src/main/java/org/panda/jdbc/id/SnowflakeIdGenerate.java b/panda-jdbc/src/main/java/org/panda/jdbc/id/SnowflakeIdGenerate.java new file mode 100644 index 0000000..431bce3 --- /dev/null +++ b/panda-jdbc/src/main/java/org/panda/jdbc/id/SnowflakeIdGenerate.java @@ -0,0 +1,138 @@ +package org.panda.jdbc.id; + +/** + * @Description 雪花主键ID生成 + * @Author qi + **/ +public class SnowflakeIdGenerate implements IdGenerate { + + /** + * 开始时间戳 + */ + private final long twepoch = 1420041600000L; + + /** + * 机器id所占的位数 + */ + private final long workerIdBits = 5L; + + /** + * 数据标识id所占的位数 + */ + private final long dataCenterIdBits = 5L; + + /** + * 支持的最大机器ID,结果是31(位移算法可以很快计算出二进制所能表示的最大十进制数) + */ + private final long maxWorkerId = -1L^(-1L<maxWorkerId||workerId<0){ + throw new IllegalArgumentException(); + } + if (dataCenterId>maxDataCenterId||dataCenterId<0){ + throw new IllegalArgumentException(); + } + this.workerId = workerId; + this.dataCenterId = dataCenterId; + } + + @Override + public synchronized Long nextId() { + + long timestamp = timeGen(); + if (timestamp { + @Override + public String nextId() { + return UUID.randomUUID().toString(); + } +}