Don’t say much, just go to the code.
package org.bood.common.utils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 生成不重复的编号的工具类
*
* @author bood
* @since 2024/01/05
*/
public class ODDGenerator {
private static final DateTimeFormatter PATTERN = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
private static final AtomicInteger ATOMIC_INTEGER = new AtomicInteger(1);
private ODDGenerator() {
}
/**
* 生成长编码策略的唯一编号
*
* @param lock 随机字符串,用来增加编号的复杂性
* @return {@link String }
* @author bood
* @since 2024/01/05
*/
public static String getC(String lock) {
// 追加lock字符串的hashCode的绝对值,以确保正数
return LocalDateTime.now().format(PATTERN) + Math.abs(lock.hashCode()) +
// 追加一个原子递增序列,以保证线程安全的唯一性
ATOMIC_INTEGER.getAndIncrement();
}
/**
* 生成短编码策略的唯一编号
*
* @param lock 随机字符串,用来增加编号的复杂性
* @return {@link String }
* @author bood
* @since 2024/01/05
*/
public static String getD(String lock) {
// 追加一个0到999之间的随机数
return String.valueOf(ThreadLocalRandom.current().nextInt(0, 1000)) +
// 追加lock字符串的hashCode的绝对值
Math.abs(lock.hashCode()) +
// 追加一个原子递增序列
ATOMIC_INTEGER.getAndIncrement();
}
}