活动验证码/兑换码生成

11 篇文章 0 订阅
7 篇文章 0 订阅

在实际开发中碰到一个需求,需要大量不重复的验证码或者兑换码,首先想到的是采用UUID来生成,但实际运用不合适因为采用UUID生成的字符串太长。所以下面我们自己生成十万的测试数据。为了快速排除生成的字符串是否重复我们可以将数据插入到数据库使用数据库的distinct方法。

开发工具:idea

开发jar包:mysql-connector-java-5.1.34-bin.jar

 

 

package cn.bjyy.demo;


import cn.bjyy.utils.JdbcUtils;
import org.junit.Test;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class CdkeyDemo {
    
    static List<String> list=new ArrayList<String>();
    public static String getStringRandom(int length) {
        String val = "";
        Random random = new Random();
        // 参数length,表示生成几位随机数
        for (int i = 0; i < length; i++) {
            String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
            // 输出字母还是数字
            if ("char".equalsIgnoreCase(charOrNum)) {
                // 输出是大写字母还是小写字母
                int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
                val += (char) (random.nextInt(26) + temp);
            } else if ("num".equalsIgnoreCase(charOrNum)) {
                val += String.valueOf(random.nextInt(10));
            }
        }
        return val;
    }

    public static void main(String[] args) {
        try {
            generalInsert();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void generalInsert() throws ClassNotFoundException,SQLException{
        long start = System.currentTimeMillis();
        Class.forName("com.mysql.jdbc.Driver");
        //数据库链接 账号密码自己替换
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/CDKEY", "root", "xxx");

        connection.setAutoCommit(false);
        PreparedStatement cmd = connection
                .prepareStatement("insert into CD_KEY(TKEY,STATUS) values(?,?)");
        //生成十万条不同的十位数兑换码  当然我是简化验证添加数据。实际中我们可以将数据放入list或者缓存
        for (int i = 0; i < 100000; i++) {
            //cmd.setInt(1,i);
            //自定义位数建议8位数以上,这个如果生成数据特别大的话有重复可能
            String stringRandom = getStringRandom(10);
            System.out.println(stringRandom);
            cmd.setString(1, stringRandom);
            cmd.setInt(2, 0);
            cmd.executeUpdate();
        }



        connection.commit();

        cmd.close();
        connection.close();

        //long end = System.currentTimeMillis();
        //System.out.println(end - start);//
    }

}

最后如果添加数据库十万条数据成功后我们打开数据使用sql语句再次检验是否重复

SELECT 字段名,COUNT(*) FROM 表名 GROUP BY 字段名 HAVING COUNT(*) > 1;

SELECT DISTINCT 字段名  FROM 表名;去重查询显示的条数和插入数据的条数一致证明没有重复数据。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值