Java 根据id不同,生成唯一礼包码

文章目录

安装 Gradle 包

dependencies {
	compile group: 'net.sourceforge.jexcelapi', name: 'jxl', version: '2.6.12'
	compile group: 'org.dom4j', name: 'dom4j', version: '2.0.0'
}

代码

见函数 :buildRandomCode。

package com.kd.shared.tool;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

/**
 * 礼品码生成工具.
 * uniqueId不同,生成的礼包码不会相同。
 */
public class GiftCodeBuilder {
    
    
    /** 礼品码的长度*/
    private static final Integer CODE_LENGTH = 10;

    private static final char [] delimiter = new char[]{
    
    '5', '2', '7', 'Z', 'B', 'Y'};

    private static final char [] mixCharactersGroup1 = new char[]{
    
    'P', 'A', 'R', '8', 'U', 'V', '1', 'F', 'X', 'M'};

    private static final char [] mixCharactersGroup2 = new char[]{
    
    'C', 'S', '3', 'E', 'H', 'J', 'K','0', 'N', 'O'};

    private static final char [] mixCharactersGroup3 = new char[]{
    
    'D', '4', 'G', 'I', '6', 'L', 'Q', 'T', 'W', '9'};

    private static final char [] number = new char[]{
    
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

    private static final char [] upperLetter = new char[]{
    
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

    private static final char [] alphaNum = new char[]{
    
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

    public static void main(String[] args) {
    
    
        generateExcel("礼包码1", 1, 1, 5);
        generateExcel("礼包码2", 2, 6, 10);
        generateExcel("礼包码3", 3, 11, 15);
    }

    public static void testCode(){
    
    
        Set<String> set = new HashSet<>();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++){
    
    
            set.add(buildRandomCode(i));
            System.out.println(buildRandomCode(i));
        }
        long end = System.currentTimeMillis();
        System.out.println(set.size());
        System.out.println(end - start);
    }

    /**
     * @param giftPackageName  礼包的名字
     * @param giftId  礼包的Id
     * @param startId 生成礼包码的起始唯一id
     * @param endId include
     */
    public static void generateExcel(String giftPackageName, int giftId, int startId, int endId){
    
    
        if(endId < startId){
    
    
            System.out.println("输入错误!");
            return;
        }
        int count = Math.max(0, endId - startId) + 1;
        String outPath = System.getProperty("user.dir") + File.separator + giftPackageName + ".xls";
        File xlsFile = new File(outPath);
        // 创建一个工作簿
        WritableWorkbook workbook = null;
        try {
    
    
            workbook = Workbook.createWorkbook(xlsFile);
        } catch (IOException e) {
    
    
            e.printStackTrace();
            return;
        }
        WritableSheet sheet = workbook.createSheet(giftPackageName, 0);
        try {
    
    
            sheet.addCell(new Label(0, 0, "id"));
            sheet.addCell(new Label(1, 0, "code"));
            sheet.addCell(new Label(2, 0, "gift_id"));
            sheet.addCell(new Label(3, 0, "uid"));
            for (int row = 1; row <= count; row++) {
    
    
                sheet.addCell(new Label(0, row, String.valueOf(startId)));
                sheet.addCell(new Label(1, row, buildRandomCode(startId)));
                sheet.addCell(new Label(2, row, String.valueOf(giftId)));
                sheet.addCell(new Label(3, row, String.valueOf(0)));
                startId += 1;
            }
        }catch (WriteException e){
    
    
            e.printStackTrace();
        }finally {
    
    
            try {
    
    
                workbook.write();
                workbook.close();
            }catch (IOException | WriteException e){
    
    
                e.printStackTrace();
            }
        }
    }

    /**
     * 区间 [0, maxValue) 随机数
     * @param maxValue
     * @return
     */
    private static int randomPositiveInt(int maxValue){
    
    
        return (int) (Math.random() * maxValue);
    }

    /**
     * 生成礼包码.
     * uniqueId不同,生成的礼包码不会相同。
     * @param uniqueId
     * @return
     */
    private static String buildRandomCode(int uniqueId){
    
    
        StringBuilder builder = new StringBuilder();
        appendRandomConfusionString(builder, uniqueId);
        prependRandomConfusionString(builder, uniqueId);
        return builder.toString();
    }

    /**
     * 补全后半部分的混淆字符串.
     * @param builder
     * @param uniqueId
     */
    private static void appendRandomConfusionString(StringBuilder builder, int uniqueId){
    
    
        int maxValue;
        for (int i = 1; i <= CODE_LENGTH; i++){
    
    
            maxValue = (int) Math.pow(10, i);
            if(uniqueId < maxValue){
    
    
                appendFixRandomConfusionString(builder, String.valueOf(uniqueId).toCharArray());
                return;
            }
        }

        System.out.println("唯一id不合法!");
        System.out.println(0);
    }

    /**
     * 补全后半部分的混淆字符串.
     * @param builder
     * @param chars
     */
    private static void appendFixRandomConfusionString(StringBuilder builder, char [] chars){
    
    
        if(chars.length <= 0){
    
    
            return;
        }

        for (int i = 0; i < chars.length; i++){
    
    
            builder.insert(0, getGroupRandomChar(chars[i]));
        }
    }

    /**
     * 补全固定混淆字符串
     * @param builder
     * @param uniqueId
     */
    private static void prependRandomConfusionString(StringBuilder builder, int uniqueId){
    
    
        int maxValue;
        for (int i = 1; i <= CODE_LENGTH; i++){
    
    
            maxValue = (int) Math.pow(10, i);
            if(uniqueId < maxValue){
    
    
                prependFixRandomConfusionString(builder, CODE_LENGTH - i);
                return;
            }
        }
    }

    /**
     * 补全固定混淆字符串
     * @param builder
     * @param length
     * @return
     */
    private static void prependFixRandomConfusionString(StringBuilder builder, int length){
    
    
        if(length <= 0){
    
    
            return;
        }

        builder.insert(0, getRandomDelimiter());

        int loop = length - 1;

        for (int i = 1; i <= loop; i++){
    
    
            builder.insert(0, getRandomChar());
        }
    }

    /**
     * 返回随机字母或者数字.
     * @return
     */
    public static char getRandomChar(){
    
    
        return alphaNum[randomPositiveInt(alphaNum.length)];
    }

    /**
     * 返回分隔字符.
     * @return
     */
    public static char getRandomDelimiter(){
    
    
        return delimiter[randomPositiveInt(delimiter.length)];
    }

    /**
     * number => [0, 9]
     * @param numChar
     * @return
     */
    public static char getGroupRandomChar(char numChar){
    
    
        if(numChar < '0' || numChar > '9'){
    
    
            System.out.println("数字超出范围");
            System.exit(0);
        }

        int group = randomPositiveInt(3);

        if(group == 0){
    
    
            return mixCharactersGroup1[Character.getNumericValue(numChar)];
        }else if(group == 1){
    
    
            return mixCharactersGroup2[Character.getNumericValue(numChar)];
        }else {
    
    
            return mixCharactersGroup3[Character.getNumericValue(numChar)];
        }
    }

    /**
     * 校验配置数据长度.
     */
    public static void checkCharacterArray(){
    
    
        Set<Character> s = new HashSet<>();

        for (char c: delimiter){
    
    
            s.add(c);
        }
        for (char c: mixCharactersGroup1){
    
    
            s.add(c);
        }
        for (char c: mixCharactersGroup2){
    
    
            s.add(c);
        }
        for (char c: mixCharactersGroup3){
    
    
            s.add(c);
        }

        System.out.println(delimiter.length);
        System.out.println(mixCharactersGroup1.length);
        System.out.println(mixCharactersGroup2.length);
        System.out.println(mixCharactersGroup3.length);
        System.out.println(s.size());

        int length2 = s.size();
        int length1 = delimiter.length + mixCharactersGroup3.length + mixCharactersGroup2.length + mixCharactersGroup1.length;

        if(length1 != length2){
    
    
            System.out.println("数组配置错误!");
        }else {
    
    
            System.out.println("数组配置正确!");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/WGYHAPPY/article/details/129926418