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

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

1.需求

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

2.代码实现

2.1 依赖

<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个小时处理为相同的值

@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 截取验证码方法

@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 验证方法

@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.总结

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

  • 不需要将生成的验证码缓存。
  • 时间入参,能够重复获取相同的值。
目录
相关文章
|
8天前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
40 15
|
1月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
64 7
|
2月前
|
数据采集 人工智能 Java
Java产科专科电子病历系统源码
产科专科电子病历系统,全结构化设计,实现产科专科电子病历与院内HIS、LIS、PACS信息系统、区域妇幼信息平台的三级互联互通,系统由门诊系统、住院系统、数据统计模块三部分组成,它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。
39 4
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
92 2
|
15天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
26 6
|
24天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
108 13
|
20天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
64 3
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
58 12
|
1月前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
54 3