java生成有序的12位序列号
时间: 2023-10-18 17:33:18 浏览: 85
可以使用Java中的UUID类来生成有序的12位序列号,具体实现如下:
```java
import java.util.UUID;
public class SerialNumberGenerator {
public static String generate() {
UUID uuid = UUID.randomUUID();
String[] strs = uuid.toString().split("-");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < strs.length; i++) {
sb.append(strs[i]);
}
return sb.toString().substring(0, 12);
}
public static void main(String[] args) {
String serialNumber = generate();
System.out.println("生成的有序序列号为:" + serialNumber);
}
}
```
这里使用UUID来生成一个唯一的字符串,然后将其转换为字符串数组,将数组中的元素连接起来得到一个长字符串,最后截取前12位即可得到一个有序的12位序列号。
相关问题
java 生成年月日加6位流水唯一id 分布式并发
生成年月日加6位流水唯一 ID,可以考虑使用 Snowflake 算法。Snowflake 算法是 Twitter 开源的分布式 ID 生成算法,使用一个 64 位的 long 型数字作为全局唯一 ID。具体实现可以使用 Java 来完成。
在 Java 中,可以使用 Snowflake 算法实现一个分布式 ID 生成器,具体步骤如下:
1. 定义一个 Snowflake 类,包含以下属性:
- 起始的时间戳(epoch)
- 机器 ID
- 序列号
2. 在 Snowflake 类中实现一个 nextId() 方法,该方法包含以下步骤:
- 获取当前时间戳(毫秒级)
- 如果当前时间戳小于上一次生成 ID 的时间戳,则说明系统时钟回退过,抛出异常
- 如果当前时间戳等于上一次生成 ID 的时间戳,则将序列号加 1
- 如果当前时间戳大于上一次生成 ID 的时间戳,则将序列号重置为 0,并更新上一次生成 ID 的时间戳为当前时间戳
- 生成一个 64 位的 long 型数字,其中高位为当前时间戳,中间位为机器 ID,低位为序列号
- 返回生成的 ID
3. 在应用程序中使用 Snowflake 类的 nextId() 方法生成唯一 ID。
由于 Snowflake 算法生成的 ID 中包含时间戳信息,因此可以保证生成的 ID 有序递增。同时,Snowflake 算法中使用了位运算和异或运算,可以保证在分布式环境下生成的 ID 不重复。
如果要使用 Snowflake 算法实现分布式并发,需要注意以下几点:
- 每个机器的机器 ID 必须唯一
- 同一机器上的线程调用 nextId() 方法时,需要考虑线程安全问题
- 不同机器上的应用程序调用 nextId() 方法时,需要考虑网络延迟和时钟不同步问题
以上是使用 Java 实现年月日加6位流水唯一 ID 的思路,具体实现可以参考 Snowflake 算法的开源实现。
java 雪花算法生成9位id
雪花算法是一种分布式唯一 ID 生成算法,可以生成唯一的、有序的、可排序的、高并发的 ID。以下是 Java 实现的 9 位雪花算法生成 ID 的示例代码:
```java
public class SnowflakeIdGenerator {
private static final long START_STAMP = 1577808000000L; // 2020-01-01 00:00:00
private static final long SEQUENCE_BITS = 4L;
private static final long WORKER_ID_BITS = 5L;
private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS);
private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);
private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;
private static final long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;
private volatile long lastTimestamp = -1L;
private volatile long sequence = 0L;
private final long workerId;
public SnowflakeIdGenerator(long workerId) {
if (workerId > MAX_WORKER_ID || workerId < 0) {
throw new IllegalArgumentException("Worker ID must be between 0 and " + MAX_WORKER_ID);
}
this.workerId = workerId;
}
public synchronized long nextId() {
long currentTimestamp = System.currentTimeMillis();
if (currentTimestamp < lastTimestamp) {
throw new RuntimeException("Clock moved backwards! Refusing to generate ID");
}
if (currentTimestamp == lastTimestamp) {
sequence = (sequence + 1) & MAX_SEQUENCE;
if (sequence == 0) {
currentTimestamp = nextTimestamp(currentTimestamp);
}
} else {
sequence = 0L;
}
lastTimestamp = currentTimestamp;
return ((currentTimestamp - START_STAMP) << TIMESTAMP_SHIFT) |
(workerId << WORKER_ID_SHIFT) |
sequence;
}
private long nextTimestamp(long currentTimestamp) {
long timestamp = System.currentTimeMillis();
while (timestamp <= currentTimestamp) {
timestamp = System.currentTimeMillis();
}
return timestamp;
}
}
```
此代码中,我们使用一个 long 类型的变量来表示生成的 ID,其中,前 41 位是时间戳(毫秒级),接着的 5 位是机器 ID,最后的 4 位是序列号。根据雪花算法的规则,序列号是每毫秒内的计数器,最大值为 15,超过则等待下一毫秒再生成 ID。
使用此类生成 9 位 ID,我们可以将机器 ID 的位数减少为 4,序列号的位数减少为 1,时间戳的起点可以设为 2020-01-01 00:00:00,代码如下:
```java
public class NineDigitsSnowflakeIdGenerator {
private static final long START_STAMP = 1577808000000L; // 2020-01-01 00:00:00
private static final long SEQUENCE_BITS = 1L;
private static final long WORKER_ID_BITS = 4L;
private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS);
private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);
private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;
private static final long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;
private volatile long lastTimestamp = -1L;
private volatile long sequence = 0L;
private final long workerId;
public NineDigitsSnowflakeIdGenerator(long workerId) {
if (workerId > MAX_WORKER_ID || workerId < 0) {
throw new IllegalArgumentException("Worker ID must be between 0 and " + MAX_WORKER_ID);
}
this.workerId = workerId;
}
public synchronized long nextId() {
long currentTimestamp = System.currentTimeMillis();
if (currentTimestamp < lastTimestamp) {
throw new RuntimeException("Clock moved backwards! Refusing to generate ID");
}
if (currentTimestamp == lastTimestamp) {
sequence = (sequence + 1) & MAX_SEQUENCE;
if (sequence == 0) {
currentTimestamp = nextTimestamp(currentTimestamp);
}
} else {
sequence = 0L;
}
lastTimestamp = currentTimestamp;
return ((currentTimestamp - START_STAMP) << TIMESTAMP_SHIFT) |
(workerId << WORKER_ID_SHIFT) |
sequence;
}
private long nextTimestamp(long currentTimestamp) {
long timestamp = System.currentTimeMillis();
while (timestamp <= currentTimestamp) {
timestamp = System.currentTimeMillis();
}
return timestamp;
}
}
```
阅读全文
相关推荐
















