100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Java代码生成随机验证码 验证数

Java代码生成随机验证码 验证数

时间:2020-05-23 05:03:51

相关推荐

Java代码生成随机验证码 验证数

/*** 业务编码生成规则*/public class CodeGeneratorUtil {static final IdGen IDG = IdGen.get();/*** 生成业务编码* @param prefix 前缀* @return*/public static String getNo(String prefix) {return prefix+IDG.nextId();}/** 定义一个获取随机验证码的方法* length :位数*/public static String getCode(int length) {String string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//保存数字0-9 和 大小写字母char[] ch = new char[length]; //声明一个字符数组对象ch 保存 验证码for (int i = 0; i < length; i++) {Random random = new Random();//创建一个新的随机数生成器int index = random.nextInt(string.length());//返回[0,string.length)范围的int值 作用:保存下标ch[i] = string.charAt(index);//charAt() : 返回指定索引处的 char 值 ==》保存到字符数组对象ch里面}//将char数组类型转换为String类型保存到resultString result = String.valueOf(ch);//方法二: String方法 valueOf(char c) :返回 char 参数的字符串表示形式。return result;}}

IdGen.java:

public class IdGen {private long workerId;private long datacenterId;private long sequence = 0L;private long twepoch = 1288834974657L; //Thu, 04 Nov 01:42:54 GMTprivate long workerIdBits = 5L; //节点ID长度private long datacenterIdBits = 5L; //数据中心ID长度private long maxWorkerId = -1L ^ (-1L << workerIdBits); //最大支持机器节点数0~31,一共32个private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); //最大支持数据中心节点数0~31,一共32个private long sequenceBits = 12L; //序列号12位private long workerIdShift = sequenceBits; //机器节点左移12位private long datacenterIdShift = sequenceBits + workerIdBits; //数据中心节点左移17位private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; //时间毫秒数左移22位private long sequenceMask = -1L ^ (-1L << sequenceBits); //4095private long lastTimestamp = -1L;private static class IdGenHolder {private static final IdGen instance = new IdGen();}public static IdGen get(){return IdGenHolder.instance;}public IdGen() {this(0L, 0L);}public IdGen(long workerId, long datacenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));}this.workerId = workerId;this.datacenterId = datacenterId;}public synchronized long nextId() {long timestamp = timeGen(); //获取当前毫秒数//如果服务器时间有问题(时钟后退) 报错。if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}//如果上次生成时间和当前时间相同,在同一毫秒内if (lastTimestamp == timestamp) {//sequence自增,因为sequence只有12bit,所以和sequenceMask相与一下,去掉高位sequence = (sequence + 1) & sequenceMask;//判断是否溢出,也就是每毫秒内超过4095,当为4096时,与sequenceMask相与,sequence就等于0if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp); //自旋等待到下一毫秒}} else {sequence = 0L; //如果和上次生成时间不同,重置sequence,就是下一毫秒开始,sequence计数重新从0开始累加}lastTimestamp = timestamp;// 最后按照规则拼出ID。// 000000000000000000000000000000000000000000 00000 00000 000000000000// time datacenterId workerId sequencereturn ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift)| (workerId << workerIdShift) | sequence;}protected long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}protected long timeGen() {return System.currentTimeMillis();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。