• 基于时间戳生成12位十六进制ID的算法

    • 2023-03-18 21:08
    • 字数 341
    • 阅读 261

    本文主要介绍一种基于时间戳生成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();
        }
    }
    
    

     

back_to_top