java 兑换码生成_java生成兑换码礼包码--工具类
importjava.util.HashSet;importjava.util.Random;importjava.util.Set;public classGenSerial {private static final String Base32Alphabet = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";/*** 生成新的序列号
*
生成规则:45位的数 (二进制)
* 标识位 + 数据位 + 校验位
* 然后将55位的数映射到用 ABCDEFGHJKLMNPQRSTUVWXYZ23456789 表示的序列号,要映射到32个字符中就是每5位代表一个字符(2^5=32),
* 所有生成的序列号是 45/5=9位。
*
*@paramcodeLen code长度
*@paramflag 标识
*@paramflagBitLen 标识长度
*@paramcheckBitLen 校验位长度
*@return
*/
public static String generateNewCode(int codeLen, int flag, int flagBitLen, intcheckBitLen) {
Long ret= 0L; //长整形ID
Random random = newRandom();int checkModData = 1< 0){
flag= flag & ((1<
ret += (long)flag << (totalBitLen - flagBitLen); //高位标志位
}
ret+= randData << checkBitLen; //中位数据位
long checkNum = (ret >> checkBitLen) % checkModData; //低位校验位
ret += checkNum; //1 - 7位 校验位
returnconvertToBase32SerialCode(ret, codeLen);
}public static String generateNewCode(int flag, intflagBitLen) {return generateNewCode(9, flag, flagBitLen, 7); //生成码9位,活动id 16位
}public static String generateNewCode(intflag) {int flagBitLen = 0;if(flag == 0){
flagBitLen= 0;
}else{
flagBitLen=Integer.toBinaryString(flag).length();
}return generateNewCode(9, flag, flagBitLen, 7); //生成码9位
}public staticString generateNewCode() {return generateNewCode(9, 0, 0, 7); //生成码9位
}/***
*@paramhistoryCodeSet 历史生成的序列号 集合
*@paramnumber
*@paramcodeLen
*@paramflag
*@paramflagBitLen
*@paramcheckBitLen
*@return
*/
public static Set generateCodes(Set historyCodeSet, int number, int codeLen, int flag, int flagBitLen, intcheckBitLen){
Set generatedCodes = new HashSet(number*4/3+1);if(historyCodeSet == null){
historyCodeSet= new HashSet(0);
}while(generatedCodes.size()
String code=generateNewCode(codeLen, flag, flagBitLen, checkBitLen);if(!historyCodeSet.contains(code)){
generatedCodes.add(code);
}
System.out.println(code);
}returngeneratedCodes;
}/***
*@paramhistoryCodeSet
*@paramnumber
*@return
*/
public static Set generateCodes(Set historyCodeSet, int number, intcodeLen){return generateCodes(historyCodeSet, number, codeLen, 0, 0, 7);
}/***
*@paramhistoryCodeSet
*@paramnumber
*@return
*/
public static Set generateCodes(Set historyCodeSet, intnumber){return generateCodes(historyCodeSet, number, 9, 0, 0, 7);
}/*** 将随机数转换成BASE32编码 序列码
*
*@return
*/
private static String convertToBase32SerialCode(long longRandValue, intcodeLen) {
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;
}returncodeSerial.reverse().toString();
}/*** 将兑换码序列字符转化成数字。
*
*@return
*/
private static int convertBase32CharToNum(charch) {int index =Base32Alphabet.indexOf(ch);returnindex;
}/*** 将序列号转成长整数
*
*@return
*/
public static longconvertBase32CharToNum(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;
}returnid;
}/*** 校验序列号是否合法
*
*@paramcode
*@return
*/
public static boolean checkCodeValid(String code, intcheckBitLen) {long id = 0;int checkModData = 1<= 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 booleancheckCodeValid(String code) {if(code == null || code.length() == 0){return false;
}return checkCodeValid(code, 7);
}/*** 从序列号提取标识
*
*@paramcode 序列号
*@paramflagBitLen 标识位长度
*@return
*/
public static Long getFlagFromCode(String code, intflagBitLen){long id =convertBase32CharToNum(code);return id >> (code.length()*5-flagBitLen);
}public static voidmain(String[] args) {
System.out.println(checkCodeValid("ARXX2BWTE"));long sTime =System.currentTimeMillis();long eTime = 0L;
Set codes = generateCodes(null, 1, 10, 3, 2, 7);
eTime=System.currentTimeMillis();
System.out.println("耗时 " + (eTime-sTime)/1000 + "秒");
sTime=eTime;
Set 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生成兑换码礼包码--工具类相关推荐
- Java生成和解析二维码工具类(简单经典)
Java生成和解析二维码工具类 开箱即用,简单不废话. pom.xml引入依赖 <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...
- java练习案例_Java项目案例之---常用工具类练习
常用工具类练习 1. 请根据控制台输入的特定日期格式拆分日期,如:请输入一个日期(格式如:**月**日****年),经过处理得到:****年**月**日 importjava.util.Scanner ...
- java 获取温度_Java利用RXTX串口通信工具类获取DS18B20温度传感器的温度值
环境:Windows10,Eclipse4.5.2,JDK1.7 设备:DS18B20温度传感器(4线,485接口),USB转485接口转换器,笔记本电脑 注意点:RTU传输,使用的是字节,那么在程序 ...
- java socket 工具包_java.net 包 Socket通信 工具类
废话1000000字省略.........呵呵...... 首先是服务器端:FileServer.java package com.stars.windsystem.tool.utils; impor ...
- java线程 睡眠_java如何编写线程睡眠工具类包括随机睡眠时长
最后给大家贴下这个睡眠工具类的完整代码 public class Sleep { /** * 睡眠n毫秒 * @param time */ public static void threadSleep ...
- 创造与魔法维护服务器奖励,创造与魔法5月最新兑换码大全 创造与魔法礼包码2021及使用方法一览...
创造与魔法2021年5月的兑换码出来了,有了兑换码可以获得大量的奖励,这是创造与魔法官方提供的最新福利,为了帮助大家能快速领取福利(狮鹫坐骑等等),小编今天就将一些永久有效的兑换码分享出来,希望能够帮 ...
- java将链接生成二维码工具类
一.添加依赖 <!-- 生成二维码--><dependency><groupId>com.google.zxing</groupId><artif ...
- java生成二维码工具类
1,先引入谷歌的插件zxing的maven坐标 <!-- 二维码 --><dependency><groupId>com.google.zxing</grou ...
- 分享一个Java生成二维码工具类
分享一个Java生成二维码工具类 直接上代码: 1.CodeUtil.class package top.lrshuai.blog.util;import java.awt.BasicStroke; ...
最新文章
- 反arp攻击软件_谈谈电子欺骗中的ARP欺骗
- 说说.net事件和委托。
- 吴玉禄他的机器人_中国人— 我们村的机器人
- html两个div间有白线,html-在特定浏览器宽度下,白线出现在渐变填充div的末尾
- mysql导出所有binlog_mysql导入、导出、查看binlog命令
- 英特尔nuc能代替主机吗_拆了拆了!Intel NUC装机!小机箱退烧器啊!主机显示器合体...
- 在Win7系统中如何安装PDF虚拟打印机
- K210车牌归属地识别[获取图像+训练+识别效果演示]
- 市场上常见饮用水种类
- php 队列取并集,php多个数组并集、交集和差集操作函数总结
- 关于同一局域网中,获取的IP非本地真实IP的问题。
- 安装debugserver到iPhone上
- neutron组网规划(flat、vlan类型)
- 【git】eclipse使用git的过程中的问题,提示rejected - non-fast-forward错误的解决办法
- 如何快速转行产品经理 少走弯路
- 从SpriteKit看我的游戏人生
- Python 搭建云服务和小程序“云办公”
- 地摊金融沦为噱头?贷款需要有房产,“被城管驱逐就赔款”
- 快速了解常见的数据库关系代数
- php实时通讯(GatewayWorker)使用入门教程
热门文章
- 内网主机通过公网域名解析访问内网服务器,存在什么问题,如何解决?
- Word——怎么在word中插入特殊符号圈4
- 串的子串(模式串)匹配算法
- 高薪程序员面试题精讲系列89之MySQL有哪些索引?
- SQL 汉字转拼音函数(转)+将表中汉字转拼音
- ApiPost是什么?
- 深度!推动“企业上云”光有补贴不够,还要看这5点
- xcopy 跳过已经存在的_视频课怎么区分数学一二三?考研英语怎么复习?恋练有词句子部分直接跳过?...
- Oracle递归查询的原理
- Qt创建设计师自定义控件(Qt Designer自定义控件)