生成16位卡号和激活码
生成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位卡号和激活码相关推荐
- 使用Python,OpenCV进行卡类型及16位卡号数字的OCR
使用Python,OpenCV进行卡类型及16位卡号数字的OCR 1. 效果图 2. 原理 2.1 OCR-A字体 2.2 检测过程步骤 2.3 优化 3. 源代码 参考 这篇博客将介绍如何通过Ope ...
- 随机生成100个卡号题目
随机生成100个卡号 1).卡号以6102009开头, 后面3位依次是 (001, 002, 003, 100), 2). 生成关于银行卡号的字典, 默认每个卡号的初始密码为"redhat& ...
- php生成16位不重复随机码,PHP n个不重复的随机数生成代码
复制代码代码如下: //range是将1到100列成一个数组 $numbers=range(1,100); //shuffle将数组顺序随即打乱 shuffle($numbers); //array_ ...
- 如何生成16位流水号
如何生成16位流水号 原文:如何生成16位流水号 /*** @Description: 获取long类型16流水号* @return serialNo long类型16流水号* @date 2017年 ...
- 51单片机二进制转bcd码c语言,16位二进制数转换成BCD码的的快速算法-51单片机...
在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序. . 说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广.做而 ...
- 16位二进制数转换成BCD码的的快速算法-51单片机
在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序. 程序可见:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5 ...
- 假设指令字长为16位,操作数的地址码为6位,指令有零地址、一地址、二地址三种格式......
假设指令字长为16位,操作数的地址码为6位,指令有零地址.一地址.二地址三种格式. (1)设操作码固定,若零地址指令有M种,一地址指令有N种,则二地址指令最多有几种? (2)采用扩展操作码技术,二 ...
- Java16位订单号,Java通过UUID生成16位唯一订单号
小编在工作中遇到了标题中的场景,先查了一些微博,参考下大佬经验.最终发现大家写的都是一套代码,没有太多的信息量做对比,并且UUID的hashcode值重复的概率有多大问题,没有人给解释.小编根据自己经 ...
- php生成8位随机不重复的邀请码
生成8位随机邀请码 : // 制作邀请码public function make_coupon_card() {$code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';$rand = ...
最新文章
- 你为世界杯而战,我为生活而战!
- nginx 集群部署_入门级实操教程!从概念到部署,全方位了解K8S Ingress!
- 2018中国自动驾驶市场专题分析
- android开发 获取父控件的高宽
- android后台截屏实现(3)--编译screencap
- SaaS CRM系统存在的五大安全漏洞
- LongAccumulator和DoubleAccumulator类如何工作?
- python绘制turtle心电图代码_python的生态系统是由标准库和第三方库组成的,turtle库是其标准库,所以不需要安装。_学小易找答案...
- SQLi LABS Less 10 时间盲注
- Android类似日历的翻转控件
- 用Python批量下载MOOC资源
- 计算机录屏幕和声音的软件是什么,电脑录屏软件带声音哪个好用 电脑录屏软件带声音软件...
- 产品经理面试——简历填写
- 软件测试真实项目大全,真实案例-项目可用性测试总结
- 校园失物招领小程序 开题报告(基于微信小程序毕业设计题目选题课题)
- 图像处理:理想低通滤波器、butterworth滤波器(巴特沃斯)、高斯滤波器实现(python)
- XYPC一款实用的平面测量控制网平差软件
- 转换成带有toc的html,JavaScript生成TOC
- 详解三极管NPN与PNP区别
- 游戏更新-拖拉机升级 Android