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

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

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


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);
        }
    }

}
时间: 2024-11-03 21:47:56

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

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助明明完成"去重"与"排序"的工作. Input Param n               输入随机数的个数 inputArray      n个随机整数组成的数组 Return Value

mysql按顺序生成一个不重复的id

非字母和非0开头按顺序生成一个不重复的id select case when max(id) is null then '10000001' else max(id)+1 end as id from student; 字母开头按顺序生成一个不重复的id select case when max(id) is null then 'S10000001' else CONCAT('S',SUBSTRING(max(id),2)+1) end as id from student; 原文地址:htt

php微信生成微信公众号二维码扫描进入公众号带参数

https://blog.csdn.net/qq_22823581/article/details/80248555 <?php namespace app\api\model; set_time_limit(30); class WxQrcode{ //构造方法 static $qrcode_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?"; static $token_url = "https://ap

10-客户端防表单重复提交和服务器端session防表单重复提交

/****************************************************DoFormServlet********************************************************/ package session; import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import

产生一个不重复的随机数组(元素各不相同的随机数组)的算法

产生一个 由0到99之间的数组成,元素各不相同的无序的一个长度为100的数组. 其实换句话说,就是把一个 由0到100之间的一个 连续的数组给打散. 由三种方式. 一:使用List 和随机数 //  long s1 = System.currentTimeMillis();  //  List ar = new ArrayList();   //   for (int i = 0; i < 100000; i++) { //    ar.add(i); //   }   //   int [] 

批量同步订单信息(包括状态)到订单中心心得

1. 调用对方接口,设置count,跟踪每次调用次数,看看调用接口总次数是否跟订单数据总量一致.记录错误日志.记录调用失败的订单号. 这是从调用方的角度跟踪检测数据. 2. 将2014年每个月调用方和接收方的数据库中各个状态订单总量进行对比,发现订单量不一致的状态.让接收方将数据库中这些状态的订单号和状态导出给接收方. 然后接收方在数据库中查询这些订单号,找出不一致的原因. 经过实际测试,这种方法效率非常高,一个下午就把2014年1-4月份.2013年下半年的订单对比完成,并且修复了状态不一致的

重复10个1~60顺序且不重复的随机数

$flag = 1; for ($i = 0; $i < 10; $i++) {     $data['mobile'] = $evaluate_mobile;     //随机时间     $second = rand($flag, 6 * ($i + 1));//重复10个1~60顺序且不重复的随机数     $flag = $second + 1;//加1是未免与上一结果重复     $data['second'] = $second;     $result[] = $data; }

已知一个函数rand5()能够生成1-5的随机数,请给出一个函数,该函数能够生成1-7的随机数。

这是朋友去笔试的一道题,有点考智商,当时我还很自信的说 random5+random5/2  不就可以了 他说不行,然后我就在网上搜了一下 有一道类似的题目 题目: 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数,该函数能够生成1-10的随机数. 思路: 假如已知一个函数能够生成1-49的随机数,那么如何以此生成1-10的随机数呢? 解法: 该解法基于一种叫做拒绝采样的方法.主要思想是只要产生一个目标范围内的随机数,则直接返回.如果产生的随机数不在目标范围内,则丢弃该值,重新取

微信公众帐号开发、营销咨询请加微信号留言YJYC0662

微信公众帐号开发.营销咨询请加微信号留言YJYC0662,或扫下面二维码关注: