生成16位不重复数字,每四位"-"隔开

  • 16位卡号
    • 工具类(规则可自己修改生成)
    • 用例
  • 卡号(16位数字,每4位之间用-隔开)
  • 激活码(12位数字+随机字母)

16位卡号

工具类(规则可自己修改生成)

package com.meditrusthealth.mth.equity.service.util;import org.apache.commons.lang3.StringUtils;import java.util.Random;/*** @description: 卡号生成工具* @author: Jay* @create: 2021-10-22 16:39**/
public class CodeNumberUtil {private static int i = 0;public static final String NUMBERCHAR = "0123456789";public static final String ENGILSHCHAR = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890";/*** Description: 生成条码(卡号)*/public static String getCodeNumber(String prefix) {if (!StringUtils.isEmpty(prefix)) {//可以修改生成随机数的长度,生成想要的长度的条码String num = generateNumString(6);String st = prefix + num + getUnixTime();return st + getCardCheckCode(st);}return "prefix不能为空";}/*** 传入一个前缀和一个码。 【根据自己的业务定义】*  卡号*/public static String getCodeNumber(String prefix, String code) {if (!StringUtils.isEmpty(prefix) && !StringUtils.isEmpty(code)) {String st = prefix + code + getUnixTime();return st + getCardCheckCode(st);}return "prefix和code不能为空";}/*** 校验条码是否正确*/public static boolean checkCode(String code) {char bit = getCardCheckCode(code.substring(0, code.length() - 1));if (bit == 'N') {return false;}return code.charAt(code.length() - 1) == bit;}/*** 从不含校验位的卡号采用 Luhm 校验算法获得校验位*/private static char getCardCheckCode(String nonCheckCodeCardNo) {if (nonCheckCodeCardNo == null|| nonCheckCodeCardNo.trim().length() == 0|| !nonCheckCodeCardNo.matches("\\d+")) {// 如果传的不是数据返回Nreturn 'N';}char[] chs = nonCheckCodeCardNo.trim().toCharArray();int luhmSum = 0;for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) {int k = chs[i] - '0';if (j % 2 == 0) {k *= 2;k = k / 10 + k % 10;}luhmSum += k;}return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0');}/**** 获取当前系统时间戳 并截取后8位*/private static String getUnixTime() {try {Thread.sleep(10);// 快速执行时,休眠10毫秒 防止号码重复} catch (InterruptedException e) {e.printStackTrace();}i++;i = i > 100 ? i % 10 : i;return ((System.currentTimeMillis() / 100) + "").substring(5)+ (i % 10);}/*** 生成一个定长的纯数字符串*/private static String generateNumString(int length) {StringBuffer sb = new StringBuffer();Random random = new Random();for (int i = 0; i < length; i++) {sb.append(NUMBERCHAR.charAt(random.nextInt(NUMBERCHAR.length())));}return sb.toString();}/*========================================================================================================*//*===============================================激活码====================================================*//*========================================================================================================*//*** Description: 生成激活码(密码)*/public static String getCodeEnglish(String prefix) {if (!StringUtils.isEmpty(prefix)) {//可以修改生成随机数的长度,生成想要的长度的条码String num = generateEngString(2);String st = prefix + num + getUnixTime();return st + getCardCheckCode(st);}return "prefix不能为空";}/*** 传入一个前缀和一个码。 【根据自己的业务定义】*  激活码*/public static String getCodeEnglish(String prefix, String code) {if (!StringUtils.isEmpty(prefix) && !StringUtils.isEmpty(code)) {String st = prefix + code + getUnixTime();return st + getCardCheckCode(st);}return "prefix和code不能为空";}/*** 生成一个定长混搭*/private static String generateEngString(int length) {StringBuffer sb = new StringBuffer();Random random = new Random();for (int i = 0; i < length; i++) {sb.append(ENGILSHCHAR.charAt(random.nextInt(ENGILSHCHAR.length())));}return sb.toString();}//测试卡号
//    public static void main(String[] args) {//
//        try {//
//            for (int i = 0; i < 1; i++) {//                // 生成条码
//                String code = getCodeNumber("99");
//                System.out.println(code);
//                // 检验条码
//                System.out.println(checkCode(code));
//            }
//
//        } catch (Exception e) {//            e.printStackTrace();
//        }
//    }//测试激活码
//    public static void main(String[] args) {//        try {//            for (int i = 0; i < 1; i++) {//                // 生成条码
//                String code = getCodeEnglish("MX","33");
//                System.out.println(code);
//                // 检验条码
//                System.out.println(checkCode(code));
//            }
//        } catch (Exception e) {//            e.printStackTrace();
//        }
//    }
}

用例

 /*** 制作卡*/@Transactional@Asyncpublic EquityCardBatchnoResp makeCardAndActivation(EquityCardBatchnoReq equityCardBatchnoReq) throws CommonException {/*创建人和创建时间*/Date date = new Date();//13位的时间戳long time = date.getTime();EquityCardBatchno equityCardBatchno = new EquityCardBatchno();BeanUtils.copyProperties(equityCardBatchnoReq,equityCardBatchno);equityCardBatchnoReq.setCreateTime(date);EquityCardBatchnoDetail equityCardBatchnoDetail = new EquityCardBatchnoDetail();equityCardBatchnoDetail.setBatchNo(String.valueOf(time));//卡数equityCardBatchno.setBacthCount(2000);/*批量制卡*/for (int i = 0; i < equityCardBatchno.getBacthCount(); i++) {String cardId = CodeNumberUtil.getCodeNumber("99");String activationCode = CodeNumberUtil.getCodeEnglish("MD");/*卡片校验*/boolean checkCode = CodeNumberUtil.checkCode(cardId);if (checkCode) {/*卡号和激活码*/cardId=cardId.replaceAll("(.{4})","$1-");cardId = cardId.substring(0, cardId.length() - 1);equityCardBatchnoDetail.setCardNo(cardId);equityCardBatchnoDetail.setActivationCode(activationCode);int saveId = equityCardBatchnoDetailMapper.insert(equityCardBatchnoDetail);if (saveId == 1) {log.warn("{卡号:" + "  " + cardId + "}" + "  " + "保存成功" + "}" +"{激活码:" + "  " + activationCode + "}" + "  " + "保存成功" + "}");} else {log.warn("{卡号:" + "  " + cardId + "}" + "  " + "保存失败" +"{激活码:" + "  " + activationCode + "}" + "  " + "保存失败" + "}");}} else {log.error("{卡号:" + "  " + cardId + "}" + "  " + "制卡失败,不符合编卡规则" + "}");}}EquityCardBatchno cardBatchno = equityCardBatchnoMapper.selectById(equityCardBatchno.getId());LambdaQueryWrapper<EquityCardBatchnoDetail> wrapper = new LambdaQueryWrapper<>();wrapper.eq(EquityCardBatchnoDetail::getBatchNo,cardBatchno.getBatchNo());List<EquityCardBatchnoDetail> list = equityCardBatchnoDetailMapper.selectList(wrapper);EquityCardBatchnoResp resp = new EquityCardBatchnoResp();BeanUtils.copyProperties(cardBatchno,resp);resp.setEquityCardBatchnoDetailList(list);log.warn("{本次制卡数量:" + "  " + equityCardBatchnoReq.getBacthCount() + "}" + "  "+"已完成}");return resp;}

卡号(16位数字,每4位之间用-隔开)

         String cardId = CodeNumberUtil.getCodeNumber("99");String activationCode = CodeNumberUtil.getCodeEnglish("MD");/*卡号校验*/boolean checkCode = CodeNumberUtil.checkCode(cardId);/*卡号和激活码*///正则表达式,每四位加"-"cardId=cardId.replaceAll("(.{4})","$1-");//去除最后一个"-"cardId = cardId.substring(0, cardId.length() - 1);System.out.println(cardId);

激活码(12位数字+随机字母)

String activationCode = CodeNumberUtil.getCodeEnglish("MD");

生成16位卡号和激活码相关推荐

  1. 使用Python,OpenCV进行卡类型及16位卡号数字的OCR

    使用Python,OpenCV进行卡类型及16位卡号数字的OCR 1. 效果图 2. 原理 2.1 OCR-A字体 2.2 检测过程步骤 2.3 优化 3. 源代码 参考 这篇博客将介绍如何通过Ope ...

  2. 随机生成100个卡号题目

    随机生成100个卡号 1).卡号以6102009开头, 后面3位依次是 (001, 002, 003, 100), 2). 生成关于银行卡号的字典, 默认每个卡号的初始密码为"redhat& ...

  3. php生成16位不重复随机码,PHP n个不重复的随机数生成代码

    复制代码代码如下: //range是将1到100列成一个数组 $numbers=range(1,100); //shuffle将数组顺序随即打乱 shuffle($numbers); //array_ ...

  4. 如何生成16位流水号

    如何生成16位流水号 原文:如何生成16位流水号 /*** @Description: 获取long类型16流水号* @return serialNo long类型16流水号* @date 2017年 ...

  5. 51单片机二进制转bcd码c语言,16位二进制数转换成BCD码的的快速算法-51单片机...

    在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序. . 说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广.做而 ...

  6. 16位二进制数转换成BCD码的的快速算法-51单片机

    在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序. 程序可见:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5 ...

  7. 假设指令字长为16位,操作数的地址码为6位,指令有零地址、一地址、二地址三种格式......

    假设指令字长为16位,操作数的地址码为6位,指令有零地址.一地址.二地址三种格式.  (1)设操作码固定,若零地址指令有M种,一地址指令有N种,则二地址指令最多有几种?  (2)采用扩展操作码技术,二 ...

  8. Java16位订单号,Java通过UUID生成16位唯一订单号

    小编在工作中遇到了标题中的场景,先查了一些微博,参考下大佬经验.最终发现大家写的都是一套代码,没有太多的信息量做对比,并且UUID的hashcode值重复的概率有多大问题,没有人给解释.小编根据自己经 ...

  9. php生成8位随机不重复的邀请码

    生成8位随机邀请码 : // 制作邀请码public function make_coupon_card() {$code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';$rand = ...

最新文章

  1. 你为世界杯而战,我为生活而战!
  2. nginx 集群部署_入门级实操教程!从概念到部署,全方位了解K8S Ingress!
  3. 2018中国自动驾驶市场专题分析
  4. android开发 获取父控件的高宽
  5. android后台截屏实现(3)--编译screencap
  6. SaaS CRM系统存在的五大安全漏洞
  7. LongAccumulator和DoubleAccumulator类如何工作?
  8. python绘制turtle心电图代码_python的生态系统是由标准库和第三方库组成的,turtle库是其标准库,所以不需要安装。_学小易找答案...
  9. SQLi LABS Less 10 时间盲注
  10. Android类似日历的翻转控件
  11. 用Python批量下载MOOC资源
  12. 计算机录屏幕和声音的软件是什么,电脑录屏软件带声音哪个好用 电脑录屏软件带声音软件...
  13. 产品经理面试——简历填写
  14. 软件测试真实项目大全,真实案例-项目可用性测试总结
  15. 校园失物招领小程序 开题报告(基于微信小程序毕业设计题目选题课题)
  16. 图像处理:理想低通滤波器、butterworth滤波器(巴特沃斯)、高斯滤波器实现(python)
  17. XYPC一款实用的平面测量控制网平差软件
  18. 转换成带有toc的html,JavaScript生成TOC
  19. 详解三极管NPN与PNP区别
  20. 游戏更新-拖拉机升级 Android

热门文章

  1. 基于互信息和左右信息熵的短语提取识别
  2. jeecgboot:设置为缓存路由,切换页面,保留数据
  3. Element ui后台管理系统界面设计
  4. 网络流媒体--SDP会话描述协议(RFC-4566)
  5. 移动比联通好的证明- -
  6. 【024】中国色–那些流淌在历史中的中国色彩
  7. MYSQL 安装/ Navicat可视化数据库使用
  8. Quartus调用ModelSim进行仿真的步骤
  9. 【虹科案例】嵌入式系统的实时高速记录器——虹科高速数字化仪应用
  10. 推荐5款软件,良心又好用!