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; // 长整形IDRandom 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位标识则是 0xffffret += (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);}}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, 7000000, 9, 0, 0, 7);eTime = System.currentTimeMillis();System.out.println("耗时 " + (eTime-sTime)/1000 + "秒");sTime = eTime;Set<String> codes2 = generateCodes(codes, 2000000, 9, 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);System.out.println("标识: " + acId);long numCode = convertBase32CharToNum(code);System.out.println("数字序列号 " + numCode);}
}

java生成兑换码礼包码相关推荐

  1. java 兑换码生成_java生成兑换码礼包码--工具类

    importjava.util.HashSet;importjava.util.Random;importjava.util.Set;public classGenSerial {private st ...

  2. Java 根据id不同,生成唯一礼包码

    文章目录 安装 Gradle 包 代码 安装 Gradle 包 dependencies {compile group: 'net.sourceforge.jexcelapi', name: 'jxl ...

  3. java 生成二维码 QRCode、zxing 两种方式

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  4. 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...

    二维码相关---java生成二维码名片,并且自动保存到手机通讯录中... 技术qq交流群:JavaDream:251572072 1.首先介绍一个api.   Zxing是Google提供的关于条码 ...

  5. java生成二维码打印到浏览器

    java生成二维码打印到浏览器 解决方法: pom.xml的依赖两个jar包: <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...

  6. Java生成二维码带LOGO底部标题竖版字体

    前言 Java后端生成二维码 底部 侧面带有标题,可调节字号 参考文章 使用Java生成二维码图片(亲测) Reborn_YY使用Java生成二维码图片 图标素材库 Java后台生成图片,前台实现图片 ...

  7. java生成二维码,并在前端展示。

    java生成二维码,并在前端展示,扫码实现下载功能. 后端生成二维码以流的形式 前端接收二维码并展示 后端生成二维码以流的形式 这是以流的形式展示二维码.当然也可以以文件的格式,文件格式就是Path ...

  8. java生成二维码(链接生成二维码)

    Java二维码如何生成? awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com. ...

  9. java生成二维码到文件,java生成二维码转成BASE64

    java生成二维码到文件,java生成二维码转成BASE64 如题,利用java和第三方库,把指定的字符串生成二维码,并且把二维码保存成图片,转换成BASE64格式. 需要的jar文件: packag ...

最新文章

  1. [Objective-c 基础 - 2.10] description方法
  2. scrapy-1.2.1安装失败之解决方法
  3. ML之NBLoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测
  4. 带有权重的服务器SLB的实现
  5. keil3如何放大字体_国潮海报不会做?送你国风字体+图案笔刷+PSD素材+包装样机...
  6. 深度学习“炼丹”难?三分钟带你了解国产丹炉旷视天元
  7. 编译器各个步骤的介绍
  8. Java调用dll文件
  9. ADAS常见缩略词(FCW/LKA/LCA/LDW...)
  10. Linux常用命令-2
  11. 电脑cd,CD光盘如何翻录在电脑上 将CD复制到电脑上步骤的方法有哪些
  12. 使用Resnet网络对人脸图像分类识别出男女性别(包含数据集制作+训练+测试)
  13. Deepgreen/Greenplum删除节点步骤
  14. 如何批量将word转换成excel表格
  15. Matlab使用图形平滑处理
  16. 阿尔萨斯监控平台普罗米修斯监控平台对服务器资源的监控
  17. 网上商城项目(购物车下单、支付)
  18. 单片机C语言零基础入门05 - 逻辑运算
  19. 你的小程序可以接广告赚钱了
  20. 使用BackTrack来增强电脑的安全

热门文章

  1. 论文那些事—Towards Evaluating the Robustnessof Neural Networks
  2. Qt制作一个等待加载窗口
  3. 【金融财经】金融市场一周简报(2017-12-08)
  4. Nginx之父被捕,程序员如何避免面向起诉编程
  5. 【zt】个人职业生涯的PPDF法(个人职业生涯发展道路)
  6. dgraph学习(二)
  7. Vue-Cli3 MPA
  8. oracle月份去掉0,Oracle取月份,不带前面的0
  9. java png转gif_【ImageMagick】png序列转gif(适合处理带透明度的图片)
  10. Python web框架 Tornado(二)异步非阻塞使用以及原理