• Java【算法 05】通过时间获取8位验证码(每两个小时生成一个)源码分享


    1.需求

    要求是很简单的,每个验证码的有效时间是2小时,这个并不是收到验证码开始计时的,而是每个两小时的时间段使用的是相同的验证码。

    2.代码实现

    2.1 依赖

    <dependency>
    	<groupId>gov.nist.mathgroupId>
    	<artifactId>jamaartifactId>
    	<version>1.0.3version>
    dependency>
    
    <dependency>
    	<groupId>commons-codecgroupId>
    	<artifactId>commons-codecartifactId>
    	<version>1.6version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.2 时间参数处理方法

    2个小时处理为相同的值

    @Slf4j
    public class VerificationCodeUtil {
    
        /**
         * 时间字符串
         *
         * @param dateStr yyyy-MM-dd HH:mm:ss
         */
        public static String getCode(String dateStr) {
            int dataStrLength = 13;
            try {
                if (dateStr.length() >= dataStrLength) {
                    String yearMonthDay = dateStr.substring(0, 10);
                    int hour = Integer.parseInt(dateStr.substring(11, 13));
                    int twoHour = 2;
                    if (hour % twoHour != 0) {
                        hour--;
                    }
                    String md5Str = DigestUtils.md5Hex("vc#" + yearMonthDay + hour);
                    return getCodeByMd5(md5Str);
                } else {
                    log.error("dateStr [{}] not match format [yyyy-MM-dd HH:mm:ss]!", dateStr);
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("dateStr [{}] not match format [yyyy-MM-dd HH:mm:ss]!", dateStr);
            }
            return dateStr;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    2.3 截取验证码方法

    @Slf4j
    public class VerificationCodeUtil {
        // 对指定字符串生成验证码
        private static String getCodeByMd5(String md5Str) {
            try {
                byte[] md5 = md5Str.getBytes();
                double[][] preMatrix = new double[4][8];
                for (int j = 0; j < 4; j++) {
                    for (int k = 0; k < 8; k++) {
                        preMatrix[j][k] = md5[j * 8 + k];
                    }
                }
                Matrix matrix = new Matrix(preMatrix);
                Matrix matrix1 = matrix.getMatrix(1, 2, 2, 5);
                Matrix matrix2 = matrix.transpose();
                Matrix matrix21 = matrix2.getMatrix(0, 3, 0, 3);
                Matrix matrix22 = matrix2.getMatrix(4, 7, 0, 3);
                Matrix matrix3 = matrix21.plus(matrix22);
                Matrix result = matrix1.times(matrix3);
    
                double[][] re = result.getArray();
                StringBuilder str = new StringBuilder();
                for (double[] doubles : re) {
                    for (double aDouble : doubles) {
                        int a = (int) aDouble % 16;
                        str.append(Integer.toHexString(a));
                    }
                }
                return str.toString().toUpperCase();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    2.4 验证方法

    @Slf4j
    public class VerificationCodeUtil {
        public static void main(String[] args) {
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            DateTime parse = DateUtil.parse("2023-11-09 23:59:59", "yyyy-MM-dd HH:mm:ss");
            String format = df.format(parse);
            System.out.println(getCode(format));
            // 00:00 3A756DFC
            // 00:59 3A756DFC
            // 01:59 3A756DFC
            // 01:59 3A756DFC
            // 02:00 9E937D4B
            // 02:59 9E937D4B
            // 03:00 9E937D4B
            // 22:00 D014DD79
            // 23:59 D014DD79        
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3.总结

    很简单的算法分享。优点:

    • 不需要将生成的验证码缓存。
    • 时间入参,能够重复获取相同的值。
  • 相关阅读:
    构造器(constructor)是否可被重写(override)?
    ES6:箭头函数中的this指向问题
    掌握 Scikit-Learn: Python 中的机器学习库入门
    互联网Java工程师面试题·Java 总结篇·第十弹
    coco数据集解析及读取方法
    Shell:常见错误总结(一)
    ES挂载不上怎么处理?
    Redis 实战缓存
    我们会把 OTA 页的权重设置得更高。
    代码随想录算法训练营第二十七天| 131.分割回文串
  • 原文地址:https://blog.csdn.net/weixin_39168541/article/details/134324610