From 8c2246cc852ffd272a9eb6498e8d235a0064fb12 Mon Sep 17 00:00:00 2001 From: qi Date: Tue, 4 Aug 2020 11:40:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=BB=E9=94=AEID=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/panda/jdbc/id/IdGenerate.java | 14 ++ .../panda/jdbc/id/SnowflakeIdGenerate.java | 138 ++++++++++++++++++ .../java/org/panda/jdbc/id/UUIdGenerate.java | 14 ++ 3 files changed, 166 insertions(+) create mode 100644 panda-jdbc/src/main/java/org/panda/jdbc/id/IdGenerate.java create mode 100644 panda-jdbc/src/main/java/org/panda/jdbc/id/SnowflakeIdGenerate.java create mode 100644 panda-jdbc/src/main/java/org/panda/jdbc/id/UUIdGenerate.java 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(); + } +}