MD5加密和解密(用Hutool工具)

@Slf4j
@SpringBootTest
class Md5DemoApplicationTests {

    /*
    todo:
     1. md5被加密的明文一致则加密后的密文必然一致
     2. md5加密后的密文 不可以还原回 明文(不可逆)
     */
    @Test
    void test01() {
        /*
        因为 md5加密算法不可逆,所以加密后的密文是固定的,
        用户输入的密码是对的则密文一定也是对的
        注册: 123456->e10adc3949ba59abbe56e057f20f883e->入库
        登录:123456->加密->e10adc3949ba59abbe56e057f20f883e->与数据库进行比较->登录成功
         */
        String md5Hex = DigestUtil.md5Hex("123456");
        System.out.println(md5Hex);
    }


    @Test
    void testRainbowTable() {
        /*
        提前获取了123456的密文e10adc3949ba59abbe56e057f20f883e
        彩虹表:常见密码的md5结果集
        */
        HashMap<String, String> map = new HashMap<>();
        for (int i = 0; i < 200000; i++) {
            map.put(String.valueOf(i),DigestUtil.md5Hex(String.valueOf(i)));
        }
        String md5Hex = map.get("123456");
        log.info("破译后的密码为:{}",md5Hex);
    }

    @Test
    void testAddSalt() {
        String password = "123456";
        //给明文密码增加一个随机数(盐),让密文更难被破解
        Random rand = new Random();
        int salt = rand.nextInt(1000) + 1000;//salt字段入库
        password = password + salt;//1234561037 ->实际被加密的明文
        log.info("salt:" + salt);
        log.info("password:" + password);
        /*
            664536ded67610c936d302f5bcf2ca47->推导出来的是1234561629
            黑客以为1234561629是密码,然而真正的密码是123456
         */
        String md5Hex = DigestUtil.md5Hex(password);
        log.info("md5Hex:" + md5Hex);
                /*
            password                                salt
            664536ded67610c936d302f5bcf2ca47        1629
         */
    }

    @Test
    void testAddSaltAndIndex() {
        String password = "123456";
        //给明文密码增加一个随机数,让密文更难被破解
        Random rand = new Random();
        int salt = rand.nextInt(1000) + 1000;//salt字段入库
        log.info("salt:{}", salt);
        //随机的插入位置
        int index = rand.nextInt(password.length());//index字段入库
        log.info("index:{}", index);
        password = password.substring(0, index) + salt + password.substring(index);
        log.info("加盐后的密码:{}", password);
        String md5Hex = DigestUtil.md5Hex(password);
        log.info("md5Hex:{}", md5Hex);
        /*
            password                                salt            index
            a9ab727a7838b2c8d0acb5fc3ffb602a        1559              5
         */
    }

    @Test
    void testDecode() {
        String password = "123456";
        int salt = 1172;
        int index = 5;
        String finalPassword = password.substring(0, index) + salt + password.substring(index);
        log.info("password:{}", finalPassword);
        if ("9964a8c3a1cf3c40795d2ed0ac8fa7ca".equals(DigestUtil.md5Hex(finalPassword))) {
            log.info("密码正确");
        } else {
            log.info("密码错误");
        }
    }

}

### 区域限制下卡车无人机联合调度优化算法 #### 1. 定义问题框架 在考虑区域限制的情况下,卡车无人机的联合调度优化旨在最大化配送效率的同时满足各种实际约束条件。这些约束包括但不限于:无人机的操作范围、载重量以及能量消耗;卡车行驶路线的时间窗口;特定区域内允许进入的交通工具种类等。 对于此类复杂场景下的路径规划与资源分配问题,通常采用混合整数线性规划(MILP)[^2] 或启发式搜索技术如遗传算法(Genetic Algorithm, GA),蚁群算法(Ant Colony Optimization, ACO) 来寻找近似最优解方案。特别是当涉及到多目标决策时(比如既要缩短总行程又要降低能耗),往往还需要引入帕累托前沿(Pareto Front) 的概念来进行权衡分析。 #### 2. 遗传算法应用于卡-机协同运输系统 针对含有多个城市节点的任务环境,在给定初始种群规模的前提下,通过交叉(Crossover) 变异(Mutation) 操作不断迭代进化新一代个体直至达到预设终止条件为止。具体到本案例中,则是以最小化完成全部订单所需时间为适应度函数(Fitness Function),并特别关注于如何合理安排每次出动过程中各飞行器的工作流程&mdash;&mdash;即从出发点装载货物起飞至指定位置卸货后再返回集合点等待下次指令这一循环过程中的细节处理。 ```python import numpy as np from deap import base, creator, tools, algorithms def eval_fitness(individual): # 计算单个染色体对应的适应度值 pass toolbox = base.Toolbox() creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) creator.create("Individual", list, fitness=creator.FitnessMin) # 初始化参数设置... population_size = 50 num_generations = 200 crossover_probability = 0.9 mutation_probability = 0.1 # 注册基本组件... toolbox.register('attr_float', lambda: random.uniform(-1, 1)) toolbox.register('individual', tools.initRepeat, creator.Individual, toolbox.attr_float, n=len(cities)) toolbox.register('population', tools.initRepeat, list, toolbox.individual) # 进化策略配置... hof = tools.HallOfFame(1) stats_fit = tools.Statistics(lambda ind: ind.fitness.values) stats_size = tools.Statistics(len) mstats = tools.MultiStatistics(fitness=stats_fit, size=stats_size) mstats.register("avg", np.mean) mstats.register("std", np.std) mstats.register("min", np.min) mstats.register("max", np.max) result_population, logbook = algorithms.eaSimple(population, toolbox, cxpb=crossover_probability, mutpb=mutation_probability, ngen=num_generations, stats=mstats, halloffame=hof, verbose=True) best_solution = hof[0] print(best_solution) ``` 此段Python代码展示了基于DEAP库实现的一个简单GA框架结构,可用于求解上述提到的小包裹递送问题实例。当然,这只是一个非常基础版本的模板,实际应用时可能还需根据具体情况调整编码方式、选择合适的初始化方法以及其他超参设定等内容。 #### 3. 结合K-Means进行服务区划分 考虑到不同地区的地形地貌差异较大,单纯依靠固定规则难以有效覆盖所有潜在客户群体。此时可借助K-means聚类算法先将整个作业区按照一定标准细分成若干个小单元格,然后再分别制定针对性更强的服务计划。例如让每台地面车辆只负责自己所属片区内站点间的往返穿梭任务,而空中平台则专注于跨区间快速转运物资等工作项[^3]。 ```matlab % 基础MATLAB脚本片段展示kmeans分区逻辑 load data.mat % 加载包含坐标信息的数据集 [idx,C] = kmeans(data,k,'Distance','sqeuclidean'); figure; scatter(data(:,1),data(:,2),[],idx); title(['Cluster Assignment with ', num2str(k),' Clusters']); hold on ; plot(C(:,1),C(:,2),'rx') legend({'Data Points','Centroids'}) xlabel('X Coordinate'); ylabel('Y Coordinate'); grid minor; axis equal tight; ``` 以上Matlab程序实现了对输入空间点集执行K均值分类操作,并可视化呈现最终得到的结果图形。这对于理解各个子区内要素分布特征及其相互关系具有重要意义,有助于后续更精细化地设计物流网络布局架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值