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

通过时间获取验证码

  • 1.需求
  • 2.代码实现
    • [2.1 依赖](#2.1 依赖)
    • [2.2 时间参数处理方法](#2.2 时间参数处理方法)
    • [2.3 截取验证码方法](#2.3 截取验证码方法)
    • [2.4 验证方法](#2.4 验证方法)
  • 3.总结

1.需求

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

2.代码实现

2.1 依赖

xml 复制代码
<dependency>
	<groupId>gov.nist.math</groupId>
	<artifactId>jama</artifactId>
	<version>1.0.3</version>
</dependency>

<dependency>
	<groupId>commons-codec</groupId>
	<artifactId>commons-codec</artifactId>
	<version>1.6</version>
</dependency>

2.2 时间参数处理方法

2个小时处理为相同的值

java 复制代码
@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;
    }
}

2.3 截取验证码方法

java 复制代码
@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;
        }
    }
}

2.4 验证方法

java 复制代码
@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        
    }
}

3.总结

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

  • 不需要将生成的验证码缓存。
  • 时间入参,能够重复获取相同的值。
相关推荐
猿人谷12 小时前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
SimonKing13 小时前
艹,维护AI写的代码,我心态崩了......
java·后端·程序员
用户2986985301413 小时前
Java Word 文档样式进阶:段落与文本背景色设置完全指南
java·后端
复杂网络13 小时前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络13 小时前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao40013 小时前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao40013 小时前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
小bo波1 天前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
JieE2122 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
nanxun8862 天前
记一次诡异的 Docker 容器"串包"故障排查
java