-
基于时间戳生成12位十六进制ID的算法
- 2023-03-18 21:08
-
字数 341
- 阅读 33
本文主要介绍一种基于时间戳生成12位十六进制ID的算法,以替换常用的UUID生成方案。传统的UUID的优点是方便,不需要数据库的支持,缺点也很明显,不但长度占了32位,且无序不利于数据库索引。而数据库自增ID虽然生成ID简单方便,但是也有天然的缺陷,如不支持分布式、安全性等。目前除了数据库自带的ID生成方案,主流的ID生成算法有基于雪花ID生成器,如百度ID生成器等。本文主要介绍一种基于时间戳生成12位十六进制的ID的算法,该ID可以解决UUID的长度问题,同时具备UUID离散型的优点,在不需要根据ID排序的特殊业务环境下,如不希望用户根据ID猜出上下文的应用场景。代码如下:
import org.springframework.stereotype.Component; import java.io.Serializable; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * 根据时间戳生成12位十六进制的ID */ @Component public class UUIDGenerator { private final DateTimeFormatter df = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS"); public Serializable generate(){ LocalDateTime dateTime = LocalDateTime.now(); String timestamp = df.format(dateTime); return toHex(Long.parseLong(timestamp)); } private String toHex(long n) { StringBuilder sb = new StringBuilder(12); char[] b = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; while (n != 0) { sb.append(b[(int) (n % 16)]); n = n / 16; } return sb.reverse().toString(); } }