如何生成不重复的订单号?这里提供一个不重复订单号生成方法

Posted 诗出函谷的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何生成不重复的订单号?这里提供一个不重复订单号生成方法相关的知识,希望对你有一定的参考价值。

 

最近老是被运营抱怨订单号太长不方便输入,可是如果随机生成太短的订单号又容易重复,造成客户提交订单失败。

夜不能眠下写了这个工具,完美解决了问题,在这里分享下,由于时间紧张考虑可能不太周到,如发现问题欢迎指教。

 



import
java.util.Collections; import java.util.HashSet; import java.util.Set; /** * 订单号生成器 */ public class OrderNoGenerator { private int size; private int length; private Set<String> orderNos; /** * 订单号生成器 * * 为了保证生成性能需满足条件size<10^length/4 * * @param size 保证连续不重读的数 * @param length 生成随机数的长度 */ public OrderNoGenerator(int size, int length) { this.size = size; this.length = length; AssertUtils.requireTrue(size < Math.pow(10, length) / 4, "参数不符合要求"); orderNos = Collections.synchronizedSet(new HashSet()); } /** * 获取不重复的随机数 * * @return */ public String generatorOrderNo() { if (orderNos.size() < size) { more(); } String next = orderNos.iterator().next(); orderNos.remove(next); return next; } private void more() { for (int i = 0; i < size * 4; i++) { orderNos.add(RandomUtils.randomNumber(length)); } } }
/**
 * 随机数工具
 */
public class RandomUtils {

    public static int[] nums = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    public static Random random = new Random();

    /**
     * 生成随机数字
     *
     * @param length 随机数长度
     * @return
     */
    public static String randomNumber(int length) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int index = random.nextInt(10);
            builder.append(nums[index]);
        }
        return builder.toString();
    }
}

 

public class AssertUtils {

    public static void requireTrue(boolean value, String msg) {
        if (!value) {
            throw new RuntimeException(msg);
        }
    }

}

 

以上是关于如何生成不重复的订单号?这里提供一个不重复订单号生成方法的主要内容,如果未能解决你的问题,请参考以下文章

PHPphp生成一个不重复的数字(订单号会员号)

生成一个不重复的订单号(php)

mysql 利用唯一索引Unique 高并发创建不重复唯一订单号是不是和兴?

java如何生成12位永远不重复的数字

包括重复的订单号但不包括重复的价格

生成订单编号 用java怎么处理