使用id生成6位数(字母加数字),亲测不会重复
使用id生成6位数(字母加数字),亲测不会重复
package cn.wkgb.common.utils;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
/**
- 根据id生成6位数
- @author Administrator
/
public class ShareCodeUtil {
/*
* 邀请码生成器,算法原理:
* 1) 获取id: 1111111
* 2) 使用自定义进制转为:gpm6
* 3) 转为字符串,并在后面加’O’字符:gpm6o
* 4)在后面随机产生若干个随机数字字符:gpm6o7
* 转为自定义进制后就不会出现o这个字符,然后在后面加个’o’,这样就能确定唯一性。最后在后面产生一些随机字符进行补全。
*/
/** 自定义进制(0,1没有加入,容易与o,l混淆) */private static final char[] r=new char[]{'Q', 'W', 'E', '8', 'A', 'S', '2', 'D', 'Z', 'X', '9', 'C', '7', 'P', '5', 'I', 'K', '3', 'M', 'J', 'U', 'F', 'R', '4', 'V', 'Y', 'l', 'T', 'N', '6', 'B', 'G', 'H'};/** (不能与自定义进制有重复) */private static final char b='O';/** 进制长度 */private static final int binLen=r.length;/** 序列最小长度 */private static final int s=6;/*** 根据ID生成六位随机码* @param id ID* @return 随机码*/public static String toSerialCode(long id) {char[] buf=new char[32];int charPos=32;while((id / binLen) > 0) {int ind=(int)(id % binLen);buf[--charPos]=r[ind];id /= binLen;}buf[--charPos]=r[(int)(id % binLen)];String str=new String(buf, charPos, (32 - charPos));// 不够长度的自动随机补全if(str.length() < s) {StringBuilder sb=new StringBuilder();sb.append(b);Random rnd=new Random();for(int i=1; i < s - str.length(); i++) {sb.append(r[rnd.nextInt(binLen)]);}str+=sb.toString();}return str;}public static long codeToId(String code) {char chs[]=code.toCharArray();long res=0L;for(int i=0; i < chs.length; i++) {int ind=0;for(int j=0; j < binLen; j++) {if(chs[i] == r[j]) {ind=j;break;}}if(chs[i] == b) {break;}if(i > 0) {res=res * binLen + ind;} else {res=ind;}}return res;}public static void main(String[] args) {Map<String, Object> map = new HashMap<String, Object>();int a=0;for (int i = 0; i < 10000000; i++) {String s = toSerialCode(i);if (map.get(s)!=null) {a++;}else {map.put(s, "2");}}System.out.println(a);}
}
使用id生成6位数(字母加数字),亲测不会重复相关推荐
- Random随机生成几位数字和UUID随机生成几位字母加数字组合
Random随机生成几位数字和UUID随机生成几位字母加数字组合 public class TestRandom { public static void main(String[] args) { ...
- SM2 生成公钥私钥 签名 加解密 亲测可用
引入pom依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava< ...
- java生成大小写字母加数字的随机数
项目中用到一授权码,网上搜索资源整理后发表 public class Random {/*** 生成32位大小写加数字随机数* @param args*/public static void main ...
- python生成随机验证码(字母加数字的组合)
目录 一.题目描述 二.解析 三.random用法: 四.源码 一.题目描述 写一个函数,生成指定长度的验证码,验证码由英文字母和数字构成 二.解析 此题为随机产生n位的验证码,而且要求为字母加数字的 ...
- php用字母数字生成用户名,请问生成字母加数字
请教生成字母加数字 有26个字母{a-Z}和10个数字{0-9} 如果要生成8位字符的,区分大小写, 这样的排列是(26+26+10)8次方=218340105584896个,这218万亿 但相邻不能 ...
- 密码是6-16位字母加数字的正则表达式和验证手机号码的正则表达式
[转载请注明出处:From李诗雨---http://blog.csdn.net/cjm2484836553/article/details/78598264] 不诗意的女程序猿不是好厨师~ 恩,正则表 ...
- formValidator正则校验密码大小写字母加数字
RegexValidator: 属性 属性名称 默认值 详细解释 regexp 正则表达式 "" 采用的是显式构造函数new RegExp("pattern" ...
- 正则【大写字母加数字,加顿号,加“至”字】
['validate-traffic-stubArea',function (v1) {var v=v1;var rex=/[A-Z0-9\u4e00-\u9fa5]+$/;var rex2=/^至+ ...
- java获取A001、A002...到ZZZZ的流水号算法(字母加数字)
在项目开发中,经常遇到流水号生成的问题.需求:生成4位的流水号,从A001.A002一直递增到ZZZZ结束. 主要思路:分为字母和数字两部分,分情况进行考虑处理,主要在于如何处理临界点的进位问题. j ...
最新文章
- 树莓派与Android客户端进行socket通信
- 第八章 熟练dom的几个常用方法
- 手把手带你撸一把springsecurity框架源码中的认证流程
- 【嵌入式】C语言高级编程-内联函数(10)
- python tkinter教程 博客园_python tkinter教程-事件绑定
- Drools DMN最新开源引擎性能改进
- 【Bash】实现指定目录下的文件编码转换,以原文件名保存
- Java提高篇 —— 抽象类与接口
- 论文浅尝 | 图神经网络的对抗攻击和防御相关文献集
- IP分类以及子网掩码
- VMware虚拟机XP系统安装
- 【CV】MLP-Mixer:用于CV任务的全 MLP 架构
- 火狐浏览器打不开html,火狐浏览器打不开网页的原因及解决办法
- 水星mw300r虚拟服务器,水星MW300R无线路由器如何设置【组图】
- 学习Matlab第三天——画3D图
- Cesium|xt3d卫星正摄动画
- pod init 报错 can‘t modify frozen String (FrozenError) [Xcodeproj] Unknown object version (56).
- (完结项目)fpga采集双路CCD摄像头1000帧图像上传到上位机显示
- android开发百度地图定位到大西洋去了!!
- 查看当前代码的php版本,如何查看php版本