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生成兑换码礼包码--工具类相关推荐

  1. Java生成和解析二维码工具类(简单经典)

    Java生成和解析二维码工具类 开箱即用,简单不废话. pom.xml引入依赖 <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...

  2. java练习案例_Java项目案例之---常用工具类练习

    常用工具类练习 1. 请根据控制台输入的特定日期格式拆分日期,如:请输入一个日期(格式如:**月**日****年),经过处理得到:****年**月**日 importjava.util.Scanner ...

  3. java 获取温度_Java利用RXTX串口通信工具类获取DS18B20温度传感器的温度值

    环境:Windows10,Eclipse4.5.2,JDK1.7 设备:DS18B20温度传感器(4线,485接口),USB转485接口转换器,笔记本电脑 注意点:RTU传输,使用的是字节,那么在程序 ...

  4. java socket 工具包_java.net 包 Socket通信 工具类

    废话1000000字省略.........呵呵...... 首先是服务器端:FileServer.java package com.stars.windsystem.tool.utils; impor ...

  5. java线程 睡眠_java如何编写线程睡眠工具类包括随机睡眠时长

    最后给大家贴下这个睡眠工具类的完整代码 public class Sleep { /** * 睡眠n毫秒 * @param time */ public static void threadSleep ...

  6. 创造与魔法维护服务器奖励,创造与魔法5月最新兑换码大全 创造与魔法礼包码2021及使用方法一览...

    创造与魔法2021年5月的兑换码出来了,有了兑换码可以获得大量的奖励,这是创造与魔法官方提供的最新福利,为了帮助大家能快速领取福利(狮鹫坐骑等等),小编今天就将一些永久有效的兑换码分享出来,希望能够帮 ...

  7. java将链接生成二维码工具类

    一.添加依赖 <!-- 生成二维码--><dependency><groupId>com.google.zxing</groupId><artif ...

  8. java生成二维码工具类

    1,先引入谷歌的插件zxing的maven坐标 <!-- 二维码 --><dependency><groupId>com.google.zxing</grou ...

  9. 分享一个Java生成二维码工具类

    分享一个Java生成二维码工具类 直接上代码: 1.CodeUtil.class package top.lrshuai.blog.util;import java.awt.BasicStroke; ...

最新文章

  1. 反arp攻击软件_谈谈电子欺骗中的ARP欺骗
  2. 说说.net事件和委托。
  3. 吴玉禄他的机器人_中国人— 我们村的机器人
  4. html两个div间有白线,html-在特定浏览器宽度下,白线出现在渐变填充div的末尾
  5. mysql导出所有binlog_mysql导入、导出、查看binlog命令
  6. 英特尔nuc能代替主机吗_拆了拆了!Intel NUC装机!小机箱退烧器啊!主机显示器合体...
  7. 在Win7系统中如何安装PDF虚拟打印机
  8. K210车牌归属地识别[获取图像+训练+识别效果演示]
  9. 市场上常见饮用水种类
  10. php 队列取并集,php多个数组并集、交集和差集操作函数总结
  11. 关于同一局域网中,获取的IP非本地真实IP的问题。
  12. 安装debugserver到iPhone上
  13. neutron组网规划(flat、vlan类型)
  14. 【git】eclipse使用git的过程中的问题,提示rejected - non-fast-forward错误的解决办法
  15. 如何快速转行产品经理 少走弯路
  16. 从SpriteKit看我的游戏人生
  17. Python 搭建云服务和小程序“云办公”
  18. 地摊金融沦为噱头?贷款需要有房产,“被城管驱逐就赔款”
  19. 快速了解常见的数据库关系代数
  20. php实时通讯(GatewayWorker)使用入门教程

热门文章

  1. 内网主机通过公网域名解析访问内网服务器,存在什么问题,如何解决?
  2. Word——怎么在word中插入特殊符号圈4
  3. 串的子串(模式串)匹配算法
  4. 高薪程序员面试题精讲系列89之MySQL有哪些索引?
  5. SQL 汉字转拼音函数(转)+将表中汉字转拼音
  6. ApiPost是什么?
  7. 深度!推动“企业上云”光有补贴不够,还要看这5点
  8. xcopy 跳过已经存在的_视频课怎么区分数学一二三?考研英语怎么复习?恋练有词句子部分直接跳过?...
  9. Oracle递归查询的原理
  10. Qt创建设计师自定义控件(Qt Designer自定义控件)