最近老是被运营抱怨订单号太长不方便输入,可是如果随机生成太短的订单号又容易重复,造成客户提交订单失败。
夜不能眠下写了这个工具,完美解决了问题,在这里分享下,由于时间紧张考虑可能不太周到,如发现问题欢迎指教。
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