分享一个我自用的简单易用的订单编号生成算法

2022-09-18 456点热度 0人点赞 0条评论

需求说明

需要做一个简单的订单号生成规则,并发量不是特别高,从订单号上不要体现出订单的真实数量(例如自增长的ID就会暴露订单数量给用户看到)

实现

示例我是写的订单号生成器,生成类似这样子的2209168334815496的16位订单号。

/**
 * @author Terry E-mail: yaoxinghuo at 126 dot com
 * @date 2022/3/4 22:57
 * @description
 */
public class OrderUtils {
    private static int serial = 0; // 序列号倒数5位的前2位

    public static int getSerial() {
        if (serial >= 99) {
            serial = 0;
        }
        serial++;
        return serial;
    }

    // 生成订单号
    public static String generateOrderNo() {
        Calendar calendar = Calendar.getInstance();
        String string1 = new SimpleDateFormat("yyMMdd").format(calendar.getTime());
        int seconds = calendar.get(Calendar.HOUR_OF_DAY) * 3600 + calendar.get(Calendar.MINUTE) * 60 + calendar.get(Calendar.SECOND);
        return string1 + seconds + new DecimalFormat("00").format(getSerial()) + new DecimalFormat("000").format(new Random().nextInt(1000));
    }
    
}

算法图形说明如下:

这个在一秒内如果没有很多并发的情况下,是非常充足的,优点是算法简单易用,当然如果有大量的并发,推荐使用雪花算法,详见:https://blog.terrynow.com/2022/09/14/distributed-id-generator-twitter-snow-flake-introduce-and-examples-with-java/

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论