java生成兑换码礼包码--工具类
import java.util.HashSet;
import java.util.Random;
import java.util.Set; public class GenSerial {
private static final String Base32Alphabet = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; /**
* 生成新的序列号 <br>
* <p>生成规则:45位的数 (二进制)<br>
* 标识位 + 数据位 + 校验位 <br>
* 然后将55位的数映射到用 ABCDEFGHJKLMNPQRSTUVWXYZ23456789 表示的序列号,要映射到32个字符中就是每5位代表一个字符(2^5=32),
* 所有生成的序列号是 45/5=9位。
*
* @param codeLen code长度
* @param flag 标识
* @param flagBitLen 标识长度
* @param checkBitLen 校验位长度
* @return
*/
public static String generateNewCode(int codeLen, int flag, int flagBitLen, int checkBitLen) {
Long ret = 0L; // 长整形ID
Random random = new Random();
int checkModData = 1<<checkBitLen;
int totalBitLen = codeLen*5;
int dataBitLen = totalBitLen - checkBitLen - flagBitLen;
long randData = (long)(1 + (1L<<dataBitLen - 1) * random.nextDouble());
if(flagBitLen > 0){
flag = flag & ((1<<flagBitLen) - 1); //防止越位,若16位标识则是 0xffff
ret += (long)flag << (totalBitLen - flagBitLen); //高位标志位
} ret += randData << checkBitLen; // 中位数据位
long checkNum = (ret >> checkBitLen) % checkModData; //低位校验位
ret += checkNum; // 1 - 7位 校验位
return convertToBase32SerialCode(ret, codeLen);
} public static String generateNewCode(int flag, int flagBitLen) {
return generateNewCode(9, flag, flagBitLen, 7); //生成码9位,活动id 16位
} public static String generateNewCode(int flag) {
int flagBitLen = 0;
if(flag == 0){
flagBitLen = 0;
}else{
flagBitLen = Integer.toBinaryString(flag).length();
}
return generateNewCode(9, flag, flagBitLen, 7); //生成码9位
} public static String generateNewCode() {
return generateNewCode(9, 0, 0, 7); //生成码9位
} /**
*
* @param historyCodeSet 历史生成的序列号 集合
* @param number
* @param codeLen
* @param flag
* @param flagBitLen
* @param checkBitLen
* @return
*/
public static Set<String> generateCodes(Set<String> historyCodeSet, int number, int codeLen, int flag, int flagBitLen, int checkBitLen){
Set<String> generatedCodes = new HashSet<String>(number*4/3+1);
if(historyCodeSet == null){
historyCodeSet = new HashSet<String>(0);
}
while(generatedCodes.size()<number){
String code = generateNewCode(codeLen, flag, flagBitLen, checkBitLen);
if(!historyCodeSet.contains(code)){
generatedCodes.add(code);
}
System.out.println(code);
}
return generatedCodes;
} /**
*
* @param historyCodeSet
* @param number
* @return
*/
public static Set<String> generateCodes(Set<String> historyCodeSet, int number, int codeLen){
return generateCodes(historyCodeSet, number, codeLen, 0, 0, 7);
} /**
*
* @param historyCodeSet
* @param number
* @return
*/
public static Set<String> generateCodes(Set<String> historyCodeSet, int number){
return generateCodes(historyCodeSet, number, 9, 0, 0, 7);
} /**
* 将随机数转换成BASE32编码 序列码
*
* @return
*/
private static String convertToBase32SerialCode(long longRandValue, int codeLen) {
StringBuffer codeSerial = new StringBuffer(16);
long tmpRandValue = longRandValue;
for (int i = 0; i < codeLen; i++) {
int code = (int) (tmpRandValue & 0x1F);
char convertCode = Base32Alphabet.charAt(code);
codeSerial.append(convertCode);
tmpRandValue = tmpRandValue >> 5;
}
return codeSerial.reverse().toString();
} /**
* 将兑换码序列字符转化成数字。
*
* @return
*/
private static int convertBase32CharToNum(char ch) {
int index = Base32Alphabet.indexOf(ch);
return index;
} /**
* 将序列号转成长整数
*
* @return
*/
public static long convertBase32CharToNum(String serialCode) {
long id = 0; for (int i = 0; i < serialCode.length(); i++) {
int originNum = convertBase32CharToNum(serialCode.charAt(i));
if(originNum == -1){
return 0;
}
id = id << 5;
id += originNum;
}
return id;
} /**
* 校验序列号是否合法
*
* @param code
* @return
*/
public static boolean checkCodeValid(String code, int checkBitLen) {
long id = 0;
int checkModData = 1<<checkBitLen;
for (int i = 0; i < code.length(); ++i) {
long originNum = convertBase32CharToNum(code.charAt(i));
if (originNum >= 32)
return false; // 字符非法
id = id<<5;
id += originNum;
} long data = id >> checkBitLen;
long checkNum = id & (checkModData-1); // 最后7位是校验码 if (data % checkModData == checkNum)
return true; return false;
} public static boolean checkCodeValid(String code) {
if(code == null || code.length() == 0){
return false;
}
return checkCodeValid(code, 7);
} /**
* 从序列号提取标识
*
* @param code 序列号
* @param flagBitLen 标识位长度
* @return
*/
public static Long getFlagFromCode(String code, int flagBitLen){
long id = convertBase32CharToNum(code);
return id >> (code.length()*5-flagBitLen);
} public static void main(String[] args) {
System.out.println(checkCodeValid("ARXX2BWTE"));
long sTime = System.currentTimeMillis();
long eTime = 0L; Set<String> codes = generateCodes(null, 1, 10, 3, 2, 7);
eTime = System.currentTimeMillis();
System.out.println("耗时 " + (eTime-sTime)/1000 + "秒");
sTime = eTime; Set<String> codes2 = generateCodes(codes, 2, 10, 0, 0, 7);
codes2.size();
eTime = System.currentTimeMillis();
System.out.println("耗时 " + (eTime-sTime)/1000 + "秒"); String code = generateNewCode(1,10);
System.out.println("序列号: "+code);
boolean checkRs = checkCodeValid(code);
System.out.println("序列号" + code + "是否合法:" + checkRs);
long acId = getFlagFromCode(code,10);
long acId1=getFlagFromCode("5DJX9MXCJU",2);
System.out.println("标识: " + acId);
System.out.println("标识: " + acId1);
long numCode = convertBase32CharToNum(code);
System.out.println("数字序列号 " + numCode); } }
java生成兑换码礼包码--工具类的更多相关文章
- java生成二维码工具类
package com.runtime.extend.utils.CodeCreate; import com.google.zxing.*;import com.google.zxing.commo ...
- iOS开发——生成二维码——工具类
啥也不说,直接上源码,拷过去就能用.生成二维码的工具类使用方法在ProduceQRCode.h里有示例说明 分别将下面的ProduceQRCode.h和ProduceQRCode.m对应的代码考到自己 ...
- java 生成二维码工具
二维码生成 Gitee:https://gitee.com/search?utf8=%E2%9C%93&search=qrext4j&group_id=&project_id= ...
- Java使用Zxing生成、解析二维码工具类
Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法. 1.二维码的生成 (1).将Zxing-core.jar 包加入到classpath下. (2). ...
- 二维码工具类 - QrcodeUtils.java
二维码工具类,提供多种生成二维码.解析二维码的方法,包括中间logo的二维码等方法. 源码如下:(点击下载 - QrcodeUtils.java.MatrixToImageWriterEx.java. ...
- java二维码工具类,中间带LOGO的,很强大
jar包下载maven 配置: Xml代码 收藏代码 <dependency> <groupId>com.google.zxing</groupId> <ar ...
- Java 字符串转码工具类
StringConvertUtils.java package javax.utils; /** * 字符串转码工具类 * * @author Logan * @createDate 2019-04- ...
- java中excel导入\导出工具类
1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...
- java 生成二维码、可带LOGO、可去白边
1.准备工作 所需jar包: JDK 1.6: commons-codec-1.11.jar core-2.2.jar javase-2.2.jar JDK 1.7: commons-codec- ...
随机推荐
- Goodbye Wuxu.B.新年的Dog划分(交互 二分 二分图)
题目链接 官方题解写得很详细,我竟然看懂了. Subtask1: 暴力的话,猜可以\(2^n\)枚举点集\(A,B\),将除了\(A,B\)之间的边全部删掉,然后询问.一定有至少一组\(A,B\)返回 ...
- Lock锁与Condition监视器(生产者与消费者)。
/*生产者与消费者第二次敲,本人表示很郁闷,以后要经常读这个 * Condition 将Object类中的监视器(wait notify notifyAll)分解成不同的对象.例如condition_ ...
- Nodejs连接mysql的增、删、改、查操作
一,创建数据库 Source Database : my_news_test SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- ...
- yii2 advanced版基础部分
yii2 advanced版 一.目录结构 1.backend 和 frontend : 前后台入口,相当于是一个单独的Basic应用,有自己的 mvc 目录.配置文件目录.入口文件目录 2.cons ...
- python之面向对象的程序设计
一.什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了程序的复杂度 缺点是: ...
- 【LCA】求和VII @北京OI2018
目录 求和VII PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE 求和VII PROBLEM 时间限制: 2 Sec 内存限制: 256 MB 题目描述 m ...
- EBS WEBADI 下载模板提示 Visual Basic 运行时错误 '91' 对象变量或With块变量未设置
按以下的方法设置一遍EXCEL,并设置浏览器的安全属性.
- 《Unity3D 实战核心技术详解》书中关于矩阵的错误
最近一直在学习实时渲染,不免要接触线性代数.而渲染中,一定会用到矩阵,当我再次去复习我之前看的书时,发现<Unity3D 实战核心技术详解>关于矩阵就有几处错误 ,特标注出来. 书的第一章 ...
- WSL(Windows Subsystem for Linux)的安装与使用及 mongodb安装
有关WSL的介绍这里就不做解释了.另外,本文仅适用于win10 build 16215以及之后的版本,之前的版本可参考官方链接. (可使用“winver”命令查看windows版本号) 安装:1. ...
- nrm管理npm源
npm源:npm install命令下载需要依赖包的服务器地址,默认是 npm ---- https://registry.npmjs.org/ 而国外的源速度太慢,所以我们一般都用国内的淘宝源tao ...