使用10个数字与52个字母生成1477万个不重复的4位串码(比如应用系统流水号应用场景),那么如何实现动态生成这类串码,并保证其不重复呢?

一.主要思想(进位思想):

将0-9-A-z,62个字符做为一个进制系统,存入一个数组,既62位数字进制,4位串码前位不够补0。
累加的操作只需要将末位往后移动一位循环移动,逢"Z"数制进一位。好比9进一位到10。

{
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
}

比如:
已知串码[a][b][c][d]
求下一位串码
将末位[d]往后移一位得到:[e]
故求得下一位串码是[a][b][c][e]

二.实现思路

输入参数:当前串码

输出:新的串码

三.下面走 java代码实现

/*** Copyright (C), 2000-2021, XXX有限公司* FileName: CombinationNumberV2* Author: wangyetao* Date: 21-10-21 15:29:22* Description:使用10个数字与52个字母生成1477万个不重复的4位串码,相当于62位数进制* 将0-9-A-z,62个字符做为一个进制系统,存入一个数组,既62位数字进制,4位串码前位不够补0。* 累加的操作只需要将末位往后移动一位循环移动,逢"Z"数制进一位。好比9进一位到10。* <p>* 比如:* * 已知串码[a][b][c][d]* * 求下一位串码* * 将末位[d]往后移一位得到:[e]* * 故求得下一位串码是[a][b][c][e]* <p>* History:* <author> <time> <version> <desc>* 作者姓名 修改时间 版本号 版本描述*/
package simple.callback.cryptographyalgorithm;/*** @ClassName: CombinationNumberV2* @Description: 使用10个数字与52个字母生成1477万个不重复的4位串码* @Author: wangyetao* @Date: 21-10-21 15:29:22*/
public class CombinationNumberV2 {private static String[] digitalsystemtable = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};private static int DIGITALMETER_LENGTH = digitalsystemtable.length;//数制表长度private int defaultDigit = 4;//数位默认长度/*** 根据当前串码获取下一位串码** @param digit          数位长度* @param currentCodeStr 当前串码* @return 获取下一位串码*/public String generateNextCode(int digit, String currentCodeStr) {String[] hexadecimalTempArr = currentCodeStr.split("");String[] hexadecimalArr = new String[defaultDigit];//串码检测boolean isCompliance = filterCharacter(currentCodeStr);if (!isCompliance) {return "不合规的串码参数";}//补位检测hexadecimalArr = doComplement(hexadecimalTempArr, hexadecimalArr);//保存单独位值String hexadecimal0 = hexadecimalArr[0];String hexadecimal1 = hexadecimalArr[1];String hexadecimal2 = hexadecimalArr[2];String hexadecimal3 = hexadecimalArr[3];//进位开关boolean _1carryup = false;boolean _2carryup = false;boolean _3carryup = false;//进位思想主要逻辑代码//[3]int hexadecimal3Index = indexOfDigitalsystemtable(hexadecimal3);hexadecimal3Index++;//下标后移一位if (hexadecimal3Index >= DIGITALMETER_LENGTH) {//检测是否需要进位hexadecimal3 = digitalsystemtable[0];//数制进位前,本位归0_3carryup = true;//数制进一位if (_3carryup) {//[2]int hexadecimal2Index = indexOfDigitalsystemtable(hexadecimal2);hexadecimal2Index++;if (hexadecimal2Index >= DIGITALMETER_LENGTH) {hexadecimal2 = digitalsystemtable[0];_2carryup = true;if (_2carryup) {//[1]int hexadecimal1Index = indexOfDigitalsystemtable(hexadecimal1);hexadecimal1Index++;if (hexadecimal1Index >= DIGITALMETER_LENGTH) {hexadecimal1 = digitalsystemtable[0];_1carryup = true;if (_1carryup) {//[0]int hexadecimal0Index = indexOfDigitalsystemtable(hexadecimal0);hexadecimal0Index++;if (hexadecimal0Index >= DIGITALMETER_LENGTH) {hexadecimal0 = digitalsystemtable[0];//单独位值[0]位已到达最大值,归为0,进入下一轮。} else {hexadecimal0 = digitalsystemtable[hexadecimal0Index];}}} else {hexadecimal1 = digitalsystemtable[hexadecimal1Index];}}} else {hexadecimal2 = digitalsystemtable[hexadecimal2Index];}}} else {hexadecimal3 = digitalsystemtable[hexadecimal3Index];//TODO 单独位值取后移一位的值,即"+1"}//拼接单独位值StringBuffer tmpBuff1 = new StringBuffer();tmpBuff1.append(hexadecimal0);tmpBuff1.append(hexadecimal1);tmpBuff1.append(hexadecimal2);tmpBuff1.append(hexadecimal3);return tmpBuff1.toString();}/*** 补位,前位不够补0** @param hexadecimalTempArr* @param hexadecimalArr* @return*/private String[] doComplement(String[] hexadecimalTempArr, String[] hexadecimalArr) {//补位,前位不够补0if (hexadecimalTempArr.length < defaultDigit) {if (hexadecimalTempArr.length == 1) {hexadecimalArr[3] = hexadecimalTempArr[0];hexadecimalArr[2] = "0";hexadecimalArr[1] = "0";hexadecimalArr[0] = "0";}if (hexadecimalTempArr.length == 2) {hexadecimalArr[3] = hexadecimalTempArr[1];hexadecimalArr[2] = hexadecimalTempArr[0];hexadecimalArr[1] = "0";hexadecimalArr[0] = "0";}if (hexadecimalTempArr.length == 3) {hexadecimalArr[3] = hexadecimalTempArr[2];hexadecimalArr[2] = hexadecimalTempArr[1];hexadecimalArr[1] = hexadecimalTempArr[0];hexadecimalArr[0] = "0";}} else {hexadecimalArr = hexadecimalTempArr;}return hexadecimalArr;}/*** 根据当前串码获取下一位串码** @param digit          数位长度* @param currentCodeStr 当前串码* @return 获取下一位串码*/private String next(int digit, String currentCodeStr) {return generateNextCode(digit, currentCodeStr);}/*** 检索值在数组中的下标** @param binaryValue* @return 下标*/private int indexOfDigitalsystemtable(String binaryValue) {int sourceIndex = -1;for (int i = 0; i < DIGITALMETER_LENGTH; i++) {if (binaryValue.equals(digitalsystemtable[i])) {sourceIndex = i;break;}}return sourceIndex;}/*** 判断是否是合规串码** @param currentCodeStr 串码* @return*/private boolean filterCharacter(String currentCodeStr) {boolean isCompliance = true;String[] hexadecimalArr = currentCodeStr.split("");for (int i = 0; i < hexadecimalArr.length; i++) {if (indexOfDigitalsystemtable(hexadecimalArr[i]) < 0) {isCompliance = false;break;}}return isCompliance;}/*** 测试用例** @param args*/public static void main(String[] args) throws InterruptedException {CombinationNumberV2 combinationNumberV2 = new CombinationNumberV2();//DEMO_TEST1/*String initStr = "0000";int count = 0;count++;long startTime = System.currentTimeMillis();System.out.println(initStr);while (!initStr.equals("ZZZZ")) {initStr = combinationNumberV2.generateNextCode(4, initStr);count++;System.out.println(initStr);}long endTime = System.currentTimeMillis();System.out.println("count=" + count + ",耗时" + (endTime - startTime) + "ms");*///DEMO_TEST2/*System.out.println(combinationNumberV2.generateNextCode(4, "0000"));System.out.println(combinationNumberV2.generateNextCode(4, "ahzz"));System.out.println(combinationNumberV2.generateNextCode(4, "YYYY"));System.out.println(combinationNumberV2.generateNextCode(4, "ZZYZ"));System.out.println(combinationNumberV2.generateNextCode(4, "ZZZY"));System.out.println(combinationNumberV2.generateNextCode(4, "ZZZZ"));System.out.println(combinationNumberV2.generateNextCode(4, "ZZZZ"));*///DEMO_TEST3/*System.out.println(combinationNumberV2.generateNextCode(4, "000"));System.out.println(combinationNumberV2.generateNextCode(4, "00"));System.out.println(combinationNumberV2.generateNextCode(4, "0"));System.out.println(combinationNumberV2.generateNextCode(4, ""));System.out.println(combinationNumberV2.generateNextCode(4, "000-"));System.out.println(combinationNumberV2.generateNextCode(4, "-00-"));System.out.println(combinationNumberV2.generateNextCode(4, "0-0-"));System.out.println(combinationNumberV2.generateNextCode(4, "--0-"));System.out.println(combinationNumberV2.generateNextCode(4, "----"));System.out.println(combinationNumberV2.generateNextCode(4, "ZZHZAA"));*///DEMO_TEST4String initStr = "0000";int count = 0;count++;long startTime = System.currentTimeMillis();System.out.println(initStr);while (!initStr.equals("ZZZZ")) {initStr = combinationNumberV2.generateNextCode(4, initStr);count++;System.out.println(initStr);Thread.sleep(100);}long endTime = System.currentTimeMillis();System.out.println("count=" + count + ",耗时" + (endTime - startTime) + "ms");/*//DEMO_TEST5FileOutputStream fos = new FileOutputStream("/home/wangyetao/Documents/CombinationNumberV2Test_DEMO_TEST5.log");String initStr = "0000";int count = 0;count++;long startTime = System.currentTimeMillis();System.out.println(initStr);fos.write((initStr + "\n").getBytes());while (!initStr.equals("ZZZZ")) {initStr = combinationNumberV2.generateNextCode(4, initStr);count++;System.out.println(initStr);fos.write((initStr + "\n").getBytes());}fos.close();long endTime = System.currentTimeMillis();System.out.println("count=" + count + ",耗时" + (endTime - startTime) + "ms");*/}}

测试与输出结果( 如下均是在main主方法中做的简单测试 )

DEMO_TEST1与输出:

//DEMO_TEST1
String initStr = "0000";
int count = 0;
count++;
long startTime = System.currentTimeMillis();
System.out.println(initStr);
while (!initStr.equals("ZZZZ")) {initStr = combinationNumberV2.generateNextCode(4, initStr);count++;System.out.println(initStr);
}
long endTime = System.currentTimeMillis();
System.out.println("count=" + count + ",耗时" + (endTime - startTime) + "ms");
0000
0001
0002
0003
0004
0005
......
ZZZx
ZZZy
ZZZz
ZZZA
ZZZB
ZZZC
ZZZD
ZZZE
ZZZF
ZZZG
ZZZH
ZZZI
ZZZJ
ZZZK
ZZZL
ZZZM
ZZZN
ZZZO
ZZZP
ZZZQ
ZZZR
ZZZS
ZZZT
ZZZU
ZZZV
ZZZW
ZZZX
ZZZY
ZZZZ
count=14776336,耗时72237msProcess finished with exit code 0

DEMO_TEST2与输出:

//DEMO_TEST2
System.out.println(combinationNumberV2.generateNextCode(4, "0000"));
System.out.println(combinationNumberV2.generateNextCode(4, "ahzz"));
System.out.println(combinationNumberV2.generateNextCode(4, "YYYY"));
System.out.println(combinationNumberV2.generateNextCode(4, "ZZYZ"));
System.out.println(combinationNumberV2.generateNextCode(4, "ZZZY"));
System.out.println(combinationNumberV2.generateNextCode(4, "ZZZZ"));
System.out.println(combinationNumberV2.generateNextCode(4, "ZZZZ"));
0001
ahzA
YYYZ
ZZZ0
ZZZZ
0000
0000Process finished with exit code 0

DEMO_TEST3与输出:

//DEMO_TEST3
System.out.println(combinationNumberV2.generateNextCode(4, "000"));
System.out.println(combinationNumberV2.generateNextCode(4, "00"));
System.out.println(combinationNumberV2.generateNextCode(4, "0"));
System.out.println(combinationNumberV2.generateNextCode(4, ""));
System.out.println(combinationNumberV2.generateNextCode(4, "000-"));
System.out.println(combinationNumberV2.generateNextCode(4, "-00-"));
System.out.println(combinationNumberV2.generateNextCode(4, "0-0-"));
System.out.println(combinationNumberV2.generateNextCode(4, "--0-"));
System.out.println(combinationNumberV2.generateNextCode(4, "----"));
System.out.println(combinationNumberV2.generateNextCode(4, "ZZHZAA"));
0001
0001
0001
不合规的串码参数
不合规的串码参数
不合规的串码参数
不合规的串码参数
不合规的串码参数
不合规的串码参数
ZZI0Process finished with exit code 0

DEMO_TEST4与输出:

//DEMO_TEST4
String initStr = "0000";
int count = 0;
count++;
long startTime = System.currentTimeMillis();
System.out.println(initStr);
while (!initStr.equals("ZZZZ")) {initStr = combinationNumberV2.generateNextCode(4, initStr);count++;System.out.println(initStr);Thread.sleep(100);
}
long endTime = System.currentTimeMillis();
System.out.println("count=" + count + ",耗时" + (endTime - startTime) + "ms");

DEMO_TEST5与输出:

//DEMO_TEST5
FileOutputStream fos = new FileOutputStream("/home/wangyetao/Documents/CombinationNumberV2Test_DEMO_TEST5.log");String initStr = "0000";
int count = 0;
count++;
long startTime = System.currentTimeMillis();
System.out.println(initStr);
fos.write((initStr + "\n").getBytes());
while (!initStr.equals("ZZZZ")) {initStr = combinationNumberV2.generateNextCode(4, initStr);count++;System.out.println(initStr);fos.write((initStr + "\n").getBytes());
}
fos.close();long endTime = System.currentTimeMillis();
System.out.println("count=" + count + ",耗时" + (endTime - startTime) + "ms");

生成的文件大小:
名称:CombinationNumberV2Test_DEMO_TEST5.log
类型:application log (text/x-log)
大小:73.9 MB (73,881,680 字节)

在此记录与总结,2021年 10月 21日 星期四 21:13:05 CST。

组合学:使用10个数字与52个字母生成1477万个不重复的4位串码相关推荐

  1. 组合学:使用10个数字与52个字母生成1477万个不重复的4位串码V4衍生版本

     一.主要思想(进位制思想与移位思想): { "0", "1", "2", "3", "4", &q ...

  2. 组合学:使用10个数字与52个字母生成1477万个不重复的4位串码V3完结版本

    一.主要思想(进位制思想): 将0-9-A-z,62个字符做为一个进制系统,存入一个数组,既62位数字进制,4位串码前位不够补0. 累加的操作只需要将末位往后移动一位循环移动,逢"Z&quo ...

  3. python随机生成30个8_Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例...

    上代码: 环境:Python3 import random,string s=string.ascii_letters+string.digits print(s) n={''.join(random ...

  4. 组合学:26个字母(含大小写)和10个数字组合为4位串的可能性测算

    使用26个字母(含大小写,实际为52个字母)和10个数字组合一个4位的串码,问有多少种组合? 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k' ...

  5. Excel表Ctrl+v和Ctrl shift+v有什么区别_Ctrl键与10个数字键,26个字母键的组合应用技巧解读...

    键盘是一种必备的输入设备,其应用率最高的就是10个数字和26个字母.如果将这10个数字和26个字母与Ctrl键组合,并应用到Excel中,会是怎样的一种体验. 一.Ctrl与数字键. 1.Ctrl+1 ...

  6. ACMNO.21 C语言-逆序输出 输入10个数字,然后逆序输出。 输入 十个整数 输出 逆序输出,空格分开 样例输入 1 2 3 4 5 6 7 8 9 0

    题目描述 输入10个数字,然后逆序输出. 输入 十个整数 输出 逆序输出,空格分开 样例输入 1 2 3 4 5 6 7 8 9 0 样例输出 0 9 8 7 6 5 4 3 2 1 提示 数组?堆栈 ...

  7. [YTU]_1046 ( 输入10个数字,然后逆序输出)

    Description 输入10个数字,然后逆序输出. Input 十个整数 Output 逆序输出,空格分开 Sample Input 1 2 3 4 5 6 7 8 9 0 Sample Outp ...

  8. Java黑皮书课后题第10章:10.21(被5或6整除)找出能被5或6整除的大于Long.MAX_VALUE的前10个数字

    Java黑皮书课后题第10章:10.21(被5或6整除)找出能被5或6整除的大于Long.MAX_VALUE的前10个数字 题目 代码 结果 题目 都在上面 代码 import java.math.B ...

  9. Java黑皮书课后题第10章:*10.16(被2或3整除)找出所有被2或3整除的有50个十进制位数的前10个数字

    10.16(被2或3整除)找出所有被2或3整除的有50个十进制位数的前10个数字 法一 破题 代码 运行结果 法二 破题 代码 运行结果 法一 破题 本题通过基本数据类型无解(求不出来,不是没有解) ...

最新文章

  1. Windows 下 tail 查看日志命令工具分享
  2. (原)JNI中env-GetByteArrayElements和AndroidBitmap_getInfo的冲突
  3. CCpp.CallGraph
  4. xpath元素和css选择器的定位
  5. 6种CSS控制元素上下居中效果
  6. 如何使用Wondershare Recoverit for Mac从崩溃的 Mac 恢复数据?
  7. 字符串不替代_【数据挖掘】MySQL中的字符串数据类型
  8. 自己为什么注册博客(csdn讲师:Array)
  9. Asp.net MVC4 与 Web Form 并存
  10. 80-040-000-原理-MySQL的 ICP
  11. AndroidStudio安卓原生开发_Android扫描附近指定的蓝牙设备_通过设备名称过滤_计算距离_离扫描设备近的显示的时候放在前面---Android原生开发工作笔记128
  12. Linux CH340驱动安装
  13. 利用cookies登录QQ空间
  14. [Spark版本更新]--2.3.0发行说明(一)
  15. Sixth season fifteenth and sixteenth episode,things that could have been......(没有如果)
  16. pointwise linux ubuntu 安装 纪录
  17. 如何招到一个靠谱的程序员,以及如何应对面试题
  18. 刚爆火就下线的 ZAO 换脸,背后是另一场技术人的狂欢
  19. 远程连接相关命令行(windows)
  20. vscode配置java_VS Code 配置 Java IDE

热门文章

  1. @Value 获取乱码 问题解决
  2. ios代码混淆-字符串加密的优点和其他破解方法
  3. 计算机excel操作教程,Excel操作教程 -电脑资料
  4. 机器健康监测的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  5. 你真的了解java编译优化吗?15个问题考察自己是否理解
  6. 处在腾讯音乐与网易云音乐夹缝中,库客音乐上市能否奏响主旋律?
  7. Windows 10 磁盘重新分区
  8. 211院校实习生三跨Java面经(头条、拼多多、华为、vivo)
  9. 电脑无法正常开机时如何解除BitLocker硬盘锁
  10. IT监控:Grafana vs Datadog详细比较