PBKDF2全面指南(SpringBoot实现版)
文章目录
- 第一部分:PBKDF2基础概念
- 1. 什么是PBKDF2?
- 2. 为什么需要PBKDF2?
- 3. PBKDF2的工作原理
- 4. PBKDF2与其他密码散列函数的比较
- 第二部分:在Java和SpringBoot中使用PBKDF2
- 1. Java内置的PBKDF2支持
- 2. SpringBoot中集成PBKDF2
- 2.1 添加依赖
- 2.2 配置PBKDF2密码编码器
- 2.3 自定义PBKDF2编码器参数
- 2.4 在用户服务中使用PBKDF2编码器
- 第三部分:PBKDF2实战 - 完整SpringBoot应用示例
- 1. 项目结构
- 2. Maven依赖
- 3. 应用属性配置
- 4. 用户模型
- 5. 用户存储库
- 6. 安全配置
- 7. 用户详情服务
- 8. 用户服务
- 9. 控制器
- 10. 模板页面
- 11. 应用主类
- 第四部分:PBKDF2性能和安全性分析
- 1. 如何选择适当的迭代次数
- 2. 盐值长度选择
- 3. PBKDF2与Bcrypt/Argon2的比较
- 第五部分:PBKDF2最佳实践和常见错误
- 1. PBKDF2安全最佳实践
- 2. 常见错误
- 错误1:使用固定或可预测的盐值
- 错误2:迭代次数过低
- 错误3:在客户端进行密码散列
- 错误4:忽略密码长度限制
- 错误5:不正确地比较散列值
- 3. 在生产环境中的注意事项
- 第六部分:总结
- 1. PBKDF2要点总结
- 错误3:在客户端进行密码散列
- 错误4:忽略密码长度限制
- 错误5:不正确地比较散列值
- 3. 在生产环境中的注意事项
- 第六部分:总结
- 1. PBKDF2要点总结
第一部分:PBKDF2基础概念
1. 什么是PBKDF2?
PBKDF2(Password-Based Key Derivation Function 2)是一种密钥派生函数,由RSA实验室的RSA公共密钥加密标准(PKCS)系列中的第5号文档《基于密码的加密标准》(PKCS#5 v2.0)定义,并已成为Internet工程任务组(IETF)的RFC 2898标准。
简单来说,PBKDF2是一种用于将用户密码安全地转换为加密密钥或散列值的算法,它专门设计用来抵抗暴力破解和字典攻击。
2. 为什么需要PBKDF2?
在现代应用程序中,我们不应该以明文形式存储用户密码,而应该存储密码的散列值。传统的散列函数(如MD5或SHA-1)存在一些问题:
- 速度太快:现代硬件可以快速计算这些散列值,使暴力破解成为可能
- 缺乏盐值(salt):相同的输入总是产生相同的输出,这使预计算攻击(彩虹表)成为可能
- 并行计算:攻击者可以使用GPU并行计算多个散列值
PBKDF2解决了这些问题:
- 它引入了计算成本因子(迭代次数),使计算过程变慢
- 它使用随机盐值,确保即使相同的密码也会生成不同的散列值
- 它是顺序计算的,难以并行化,这降低了GPU加速攻击的效率
3. PBKDF2的工作原理
详细步骤解析:
- 输入收集:获取用户密码和随机生成的盐值
- 伪随机函数选择:通常使用HMAC-SHA1、HMAC-SHA256或HMAC-SHA512
- 应用PBKDF2函数:
- 将密码和盐值作为输入
- 指定迭代次数(通常为至少10,000次,现代系统建议100,000次以上)
- 指定所需的输出长度(通常为256位或512位)
- 输出:生成最终的密钥或散列值
数学上,PBKDF2可表示为:
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
其中:
- DK:派生密钥
- PRF:伪随机函数(如HMAC-SHA256)
- Password:用户密码
- Salt:随机盐值
- c:迭代次数
- dkLen:派生密钥的长度
4. PBKDF2与其他密码散列函数的比较
函数 | 优点 | 缺点 | 安全性 |
---|---|---|---|
MD5/SHA | 速度快 | 无盐值,计算成本低 | 极低 |
PBKDF2 | 有盐值,可调整迭代次数 | 可以GPU并行化(相对Bcrypt和Argon2而言) | 中高 |
Bcrypt | 有盐值,内置成本因子,抗GPU攻击 | 内存需求固定,输出长度固定为192位 | 高 |
Argon2 | 可调整时间、内存、并行度,2015年密码散列竞赛冠军 | 相对较新,库支持不如PBKDF2广泛 | 非常高 |
何时选择PBKDF2:
- 当你需要一个广泛支持、经过时间考验的算法
- 当你需要符合某些特定标准(如FIPS)
- 当你需要生成特定长度的密钥而不仅仅是密码散列
第二部分:在Java和SpringBoot中使用PBKDF2
1. Java内置的PBKDF2支持
从Java 8开始,JDK提供了内置的PBKDF2实现,位于javax.crypto
包中:
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Arrays;
import java.util.Base64;public class PBKDF2Hasher {// 算法名称private static final String ALGORITHM = "PBKDF2WithHmacSHA256";// 迭代次数private static final int ITERATIONS = 65536;// 密钥长度private static final int KEY_LENGTH = 256;// 盐值长度private static final int SALT_LENGTH = 16;// 生成盐值public static byte[] generateSalt() {SecureRandom random = new SecureRandom();byte[] salt = new byte[SALT_LENGTH];random.nextBytes(salt);return salt;}// 使用PBKDF2生成散列值public static byte[] hash(char[] password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException {KeySpec spec = new PBEKeySpec(password, salt, ITERATIONS, KEY_LENGTH);SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);return factory.generateSecret(spec).getEncoded();}// 验证密码public static boolean verify(char[] password, byte[] hash, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException {byte[] testHash = hash(password, salt);return Arrays.equals(hash, testHash);}// 生成散列值和盐值,并编码为Base64字符串public static String[] hashPassword(String password) throws NoSuchAlgorithmException, InvalidKeySpecException {byte[] salt = generateSalt();byte[] hash = hash(password.toCharArray(), salt);String hashString = Base64.getEncoder().encodeToString(hash);String saltString = Base64.getEncoder().encodeToString(salt);return new String[] { hashString, saltString };}// 从Base64字符串中验证密码public static boolean verifyPassword(String password, String hashString, String saltString) throws NoSuchAlgorithmException, InvalidKeySpecException {byte[] hash = Base64.getDecoder().decode(hashString);byte[] salt = Base64.getDecoder().decode(saltString);return verify(password.toCharArray(), hash, salt);}
}
2. SpringBoot中集成PBKDF2
在Spring Security中,从5.0版本开始,提供了内置的PBKDF2密码编码器Pbkdf2PasswordEncoder
。以下是在SpringBoot项目中集成PBKDF2的方法:
2.1 添加依赖
首先,确保你的SpringBoot项目中包含Spring Security依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.2 配置PBKDF2密码编码器
在Spring Security配置类中配置Pbkdf2PasswordEncoder
:
package com.example.pbkdf2demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();return http.build();}@Beanpublic PasswordEncoder passwordEncoder() {// 创建PBKDF2密码编码器// 参数分别是:密钥迭代次数、密钥长度(比特)// Spring Security 5.x 版本return new Pbkdf2PasswordEncoder("", 185000, 256);// Spring Security 6.x 及更高版本// return Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8();}
}
2.3 自定义PBKDF2编码器参数
如果需要更精细地控制PBKDF2参数,可以这样配置:
@Bean
public PasswordEncoder passwordEncoder() {// SpringBoot 2.x 和 Spring Security 5.xString secret = "your-secret"; // 可选的密钥int iterations = 210000; // 迭代次数int hashWidth = 512; // 哈希长度(比特)return new Pbkdf2PasswordEncoder(secret,iterations,hashWidth);// SpringBoot 3.x 和 Spring Security 6.x/*return Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8().secret("your-secret").iterations(210000).hashWidth(512).algorithm(Pbkdf2PasswordEncoder.SecretKeyFactoryAlgorithm.PBKDF2WithHmacSHA512).build();*/
}
2.4 在用户服务中使用PBKDF2编码器
package com.example.pbkdf2demo.service;import com.example.pbkdf2demo.model.User;
import com.example.pbkdf2demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Autowiredprivate PasswordEncoder passwordEncoder;public User registerUser(String username, String password) {// 判断用户名是否已存在if (userRepository.findByUsername(username).isPresent()) {throw new IllegalArgumentException("用户名已存在");}// 使用PBKDF2编码密码String encodedPassword = passwordEncoder.encode(password);// 创建新用户User user = new User();user.setUsername(username);user.setPassword(encodedPassword); // 存储PBKDF2编码后的密码user.setEnabled(true);return userRepository.save(user);}public boolean authenticate(String username, String password) {return userRepository.findByUsername(username).map(user -> passwordEncoder.matches(password, user.getPassword())
相关文章:
PBKDF2全面指南(SpringBoot实现版)
文章目录 第一部分:PBKDF2基础概念1. 什么是PBKDF2?2. 为什么需要PBKDF2?3. PBKDF2的工作原理4. PBKDF2与其他密码散列函数的比较第二部分:在Java和SpringBoot中使用PBKDF21. Java内置的PBKDF2支持2. SpringBoot中集成PBKDF22.1 添加依赖2.2 配置PBKDF2密码编码器2.3 自定义…...
基于RV1126开发板的rknn-toolkit-lite使用方法
1. rknn-toolkit-lite介绍 rknn-toolkit-lite是用于python算法的推理的组件,当前已经在EASY-EAI-Nano完成适配,用户可以用它进行深度学习算法的纯python开发。而且同时支持已经进行了预编译的模型,短短几行代码即可完成算法的推理,…...
一款轻量级的PHP地址发布页面源码
源码介绍 一款轻量级的PHP链接发布页面源码,适合快速搭建个性化的链接导航网站,支持动态链接管理和多种风格模板切换 1:后台登录地址为/admin/login.php,提供便捷的配置入口。 2:默认用户名是admin,密码为…...
分布式计算领域的前沿工具:Ray、Kubeflow与Spark的对比与协同
在当今机器学习和大数据领域,分布式计算已成为解决大规模计算问题的关键技术。本文将深入探讨三种主流分布式计算框架——Ray、Kubeflow和Spark,分析它们各自的特点、应用场景以及如何结合它们的优势创建更强大的计算平台。 Spark批量清洗快,…...
【专题刷题】双指针(一)
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:1,本人解法 本人屎山代码;2,优质解法 优质代码;3,精益求精,…...
火山引擎旗下防御有哪些
首先,我需要确认用户是不是打错了,比如把“引擎”当成了“云”,或者他们真的想了解火山引擎的防御机制。火山引擎是字节跳动旗下的云服务平台,类似于阿里云或腾讯云,所以用户可能想了解的是其安全防护措施。 接下来&am…...
python程序打包——nuitka使用
目前python打包成exe的工具主要有:PyInstaller Briefcase py2exe py2app Nuitka CX_Freeze等。 不同于C代码,可以直接编译成可执行的exe文件,或者js代码在浏览器中就能执行,python代码必须通过python解释器来运行,…...
编写了一个专门供强化学习玩的贪吃蛇小游戏,可以作为后续学习的playgraound
文章目录 **试玩效果****项目背景****核心设计思路****代码亮点解析****与强化学习算法的对接示例****扩展方向****总结****完整代码**把训练一个会玩小游戏的智能体,作为学习强化学习的一个目标,真的是很有乐趣的一件事。我已经不知为此花费了多少日夜了。如今已是着魔了一般…...
chain_type=“stuff 是什么 ? 其他方式有什么?
chain_type="stuff 是什么 ? 其他方式有什么? 目录 chain_type="stuff 是什么 ? 其他方式有什么?1. `chain_type="stuff"`2. `chain_type="map_reduce"`3. `chain_type="refine"`4. `chain_type="map_rerank"`在 LangCh…...
在IDEA里面建立maven项目(便于java web使用)
具体步骤: 第一次有的电脑你再创建项目的时候右下角会提醒你弹窗:让你下载没有的东西 一定要下载!!可能会很慢 运行结果: 因为他是默认的8080端口所以在运行的时候输入的url如下图: 新建了一个controller代…...
MyBatis 详解
1. 什么是 MyBatis? MyBatis 是一款优秀的 持久层框架,它通过 XML 或注解配置,将 Java 对象(POJO)与数据库操作(SQL)进行灵活映射,简化了 JDBC 的复杂操作。 核心思想:S…...
郑州工程技术学院党委书记甘勇一行莅临埃文科技调研交流
为深化产教融合、推动人工智能领域人才培养与产业需求精准对接,2025年4月9日下午,郑州工程技术学院党委书记甘勇、河南省人工智能产业创新发展联盟执行秘书长孟松涛等一行莅临埃文科技调研交流。 一、聚焦技术前沿 共话AI产业变革 座谈会上,…...
AI应用开发之扣子第一课-夸夸机器人
首先,进入官网:点击跳转至扣子。 1.创建智能体 登录进网站后,点击左上角+图标,创建智能体,输入智能体名称、功能介绍 2.输入智能体提示词 在“人设与回复逻辑”输入以下内容: # 角色 你是一…...
Node.js 数据库 CRUD 项目示例
希望使用Nodejs操作数据库做CRUD,用deepseek实战搜索“使用Nodejs对数据库表做CRUD的项目例子”,找到了解决方案,如下图所示: 项目结构 nodejs-crud-example/ ├── config/ │ └── db.js # 数据库连接配置 ├──…...
ESP8266/32作为AVR编程器(ISP programmer)的使用介绍
ESP8266作为AVR编程器( ISP programmer)的使用介绍 🌿ESP8266自带库例程:https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266AVRISP📍支持ESP8266/32的ESP_AVRISP其它开源工程(个人没有再去验证)&…...
union all几个常见问题及其解决方案
UNION ALL 是 SQL 中用于合并两个或多个 SELECT 语句结果集的操作符。与 UNION 不同,UNION ALL 不会去除重复的记录,它简单地将一个查询的结果附加到另一个查询的结果之后。尽管 UNION ALL 相对来说更高效(因为它不需要检查重复项)…...
21.C++11
1.列表初始化 1.1C11中的{} •C11以后想统⼀初始化⽅式,试图实现⼀切对象皆可⽤{}初始化,{}初始化也叫做列表初始化。 • 内置类型⽀持,⾃定义类型也⽀持,⾃定义类型本质是类型转换,中间会产⽣临时对象,最…...
【交叉编译】目标机编译安装对应依赖库总结
1、解压目标机交叉编译工具链 # 创建工具链存放目录(可选) sudo mkdir -p /opt/toolchain# 解压到目标路径(示例路径:/opt/toolchain) sudo tar -xzvf 目标主机编译工具链.tar.gz -C /opt/toolchain# 查看解压后的目录…...
Docker华为云创建私人镜像仓库
Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 : 或者在其他页面的搜索栏中搜索 容器镜像服务 : 进入到页面后,点击 创建组织 (华为云的镜像仓库称为组织): 设置组织名字后&…...
【15】数据结构之基于树的查找算法篇章
目录标题 二叉排序树 Binary Sort Tree二叉排序树的插入二叉树排序树的删除二叉排序树的查找二叉排序树的调试与代码集合 平衡二叉树-AV树平衡二叉树的平衡化旋转平衡二叉树的代码调试与代码集合 B树B树的查找B树的插入B树和B*树 二叉排序树 Binary Sort Tree 二叉…...
自定义类型之结构体
1.结构体类型概述 结构体类型是一种用户自定义的数据类型,用于将不同类型的数据组合成一个整体。在C语言中,结构体使用struct关键字定义,由一系列具有相同类型或不同类型的数据构成的数据集合,也称为结构。结构体中的数据在逻辑上…...
SGFormer:卫星-地面融合 3D 语义场景补全
论文介绍 题目:SGFormer: Satellite-Ground Fusion for 3D Semantic Scene Completion 会议:IEEE / CVF Computer Vision and Pattern Recognition Conference 论文:https://www.arxiv.org/abs/2503.16825 代码:https://githu…...
应急响应篇钓鱼攻击邮件与文件EML还原蠕虫分析线索定性处置封锁
钓鱼邮件的eml中会有 邮件服务器地址域名(发信人)发送的本地IP和主机名发送的内容以及附件 邮件钓鱼: 攻击者目的:通过发信人,附件,取得突破 定性钓鱼邮件 威胁情报,人工分析来源,…...
利用纯JS开发浏览器小窗口移动广告小功能
效果展示 直接上代码 如果要用到vue项目里面,直接按照vue的写法改动就行,一般没有多大的问题,顶部的占位是我项目需求,你可以按照要求改动。 <!DOCTYPE html> <html> <head><meta charset"utf-8"…...
java Stream流
Stream流 双列集合无法直接使用stream流,可以通过keyset()或enteyset转换为单列集合,再进行操作 1.单列集合 package mystream;import java.util.ArrayList; import java.util.Collections;public class StreamDemo1 {public sta…...
【实战中提升自己】 防火墙篇之VPX部署–L2TP over IPSEC
1 VPx部署【L2TP Over ipsec】 说明:在VPX上面,我们希望与分部建立VPX,保证与分部的财务部正常通信,另外还提供L2TP Over ISPEC功能,方便远程接入访问内部服务器等。当然我们也可以做详细的控制ÿ…...
贪心算法(20)(java)整数替换
给定一个正整数 n ,你可以做如下操作: 如果 n 是偶数,则用 n / 2替换 n 。如果 n 是奇数,则可以用 n 1或n - 1替换 n 。 返回 n 变为 1 所需的 最小替换次数 。 示例 1: 输入:n 8 输出:3 解…...
实验二.单按键控制LED
1.实验任务 如图4.1所示:在P0.0端口上接一个发光二极管L1,按键按一下灯亮,在按一下灯灭。 2.电路原理图 3.系统板上硬件连线 把“单片机系统”区域中的P0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。 4.程序设计内容...
Ubuntu 常用命令行指令
1. 文件与目录操作 命令作用示例ls列出目录内容ls -l(详细列表)cd切换目录cd ~/Documentspwd显示当前目录路径pwdmkdir创建目录mkdir new_folderrm删除文件rm file.txtrm -r递归删除目录rm -r old_dircp复制文件cp file.txt backup/mv移动/重命名文件mv…...
Cribl 数据脱敏 -02 (附 测试数据)
先把实验的测试方向如下: Match Regex Replace Expression Example result <...
【项目管理】第16章 项目采购管理-- 知识点整理
项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应&…...
根据关键字搜索日志内容,常用的Linux命令
在 Linux 中,根据关键字搜索日志内容是运维和开发的常见需求。以下是常用的命令及场景示例: 1. grep 基础搜索 (1) 简单关键字匹配 # 在文件中搜索包含 "error" 的行 grep "error" /var/log/nginx/error.log# 忽略大小写ÿ…...
数据结构(六)——红黑树及模拟实现
目录 前言 红黑树的概念及性质 红黑树的效率 红黑树的结构 红黑树的插入 变色不旋转 单旋变色 双旋变色 插入代码如下所示: 红黑树的查找 红黑树的验证 红黑树代码如下所示: 小结 前言 在前面的文章我们介绍了AVL这一棵完全二叉搜索树&…...
【Linux】基础 IO(文件描述符、重定向、缓冲区)
Linux 1.理解文件2.C文件接口1.打开 写文件2.读文件 简单实现cat命令3.输出信息到显示器的方式4.stdin、stdout、stderr5.打开文件的方式 3.系统接口 IO1.传递标志位2.open、close3.write、read 4.文件描述符1.是什么?2.分配规则3.重定向原理4.通过dup2系统调用重…...
记录一下远程调试 备忘
在进行远程调试时,目标主机不需要安装完整的编程环境(舍去重复安装)。可以使用Visual Studio的远程调试功能,或者使用gdb和gdbserver进行远程调试。 Visual Studio远程调试 复制远程调试器文件夹:将Visual Studio安装目录下的remot…...
libevent服务器附带qt界面开发(附带源码)
本章是入门章节,讲解如何实现一个附带界面的服务器,后续会完善与优化 使用qt编译libevent源码演示视频qt的一些知识 1.主要功能有登录界面 2.基于libevent实现的服务器的业务功能 使用qt编译libevent 下载这个,其他版本也可以 主要是github上…...
MyISAM索引方案
在InnoDB中索引即数据,也就是聚簇索引的B树叶子节点已经包含了所有完整的用户记录,MyISAM的索引方案虽然也是树形结构,但是将索引和数据分开存储 将表中的记录按记录的插入顺序单独存储在一个文件中【数据文件】,这个文件不划分数…...
Windows 图形显示驱动开发-WDDM 1.2功能—WDDM 1.2 中的 Direct3D 功能和要求
一、架构演进与驱动模型 1.1 WDDM驱动模型的革命性升级 Windows 8引入的WDDM 1.2驱动模型在以下方面实现突破: 内存管理:采用统一虚拟地址空间(UVA)架构,使CPU和GPU可共享相同的指针地址空间。具体实现通过DXGK_DRI…...
深度解析 Vue 项目 Webpack 分包与合包 一文读懂
深度解析 Vue 项目 Webpack 分包与合包 一文读懂 文章目录 深度解析 Vue 项目 Webpack 分包与合包 一文读懂一、Webpack 打包机制深度解析1.1 模块化系统的本质1.2 Webpack 构建流程解析1.3 默认打包的问题分析 二、分包策略深度配置2.1 SplitChunksPlugin 核心配置2.2 精细化分…...
【ROS】map_server 地图的保存和加载
【ROS】map_server 地图的保存和加载 前言地图的保存地图的加载 前言 在 ROS 中,想要实现导航功能,首先需要一张已建好的地图。导航系统依赖这张地图进行路径规划、定位和障碍物避让等操作。本文将讲解在使用 gmapping 或 hector_mapping 建图后&#x…...
【计网】SSL/TLS核心原理
序言 在HTTP协议中,信息是明文传输的,因此为了通信安全就有了HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)协议。HTTPS也是一种超文本传送协议,在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务端的…...
sqli-labs靶场 less 11
文章目录 sqli-labs靶场less 11 POS联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”&…...
陕化之光(原创)
当城市在和周公化合 陕化的工装已与朝霞发生反应 工人先锋号已然吹响 陕化工人游走在工作的床层 钢铁森林间穿梭的身影 是沉默的催化剂 让冰冷的方程式 绽放出最活跃的分子温度 扳手与阀门对话时 塔林正在记录 关于电流与压力的学习笔记 每一次精确的调控 都是舞台上…...
【刷题2025】高级数据结构(并查集+优先队列+图论)
1.并查集 (1)基础理论 并查集是一种树形的数据结构,用于处理一些不相交集合的 合并 及 查询 问题。比如,可以用并查集判断一个森林中有几棵树、某个节点是否属于某棵树。 并查集由一个整形数组 pre[] 和两个函数 find() 、 join() 构成。 数组 pre[] 记录了每个点的前驱…...
数据库性能优化(sql优化)_分布式优化思路01_yxy
数据库性能优化_分布式优化思路01 1 分布式数据库的独特挑战2 分布式新增操作符介绍2.1 数据交换操作符(ESEND/ERECV):2.2 数据迭代操作符GI:3 核心优化策略(一)_分区裁剪优化3.1 普通分区裁剪3.2 动态分区裁剪1 分布式数据库的独特挑战 在分布式数据库系统中,核心为数据被…...
云服务器和物理服务器有什么区别
云服务器与物理服务器的核心区别在于资源分配方式、性能稳定性、成本结构、运维管理及 适用场景。以下是具体分析: 一、资源分配与架构差异 云服务器:基于虚拟化技术,将物理服务器集群分割为多个虚拟实例,资源由多个用户 共享,可根据需求弹性调整配置…...
FPGA-DDS技术的波形发生器
1.实验目的 1.1掌握直接数字频率合成(DDS)的基本原理及其实现方法。 1.2在DE2-115 FPGA开发板上设计一个可调频率的正弦波和方波发生器,频率范围10Hz~5MHz,最小分辨率小于1kHz。 1.3使用Quartus II进行仿真,并通过S…...
晶晨线刷工具下载及易错点说明:Key文件配置错误/mac剩余数为0解决方法
晶晨线刷工具下载及易错点说明:Key文件配置错误/mac剩余数为0解决方法 各种版本晶晨线刷工具下载: 晶晨线刷工具易出错点故障解决方法: 1、晶晨线刷工具加载固件的时候提示mac红字且剩余数为0的解决办法 很多同学可能会与遇到加…...
idea如何使用git
在 IntelliJ IDEA 中使用 Git 的详细步骤如下,分为配置、基础操作和高级功能,适合新手快速上手: 一、配置 Git 安装 Git 下载并安装 Git,安装时勾选“Add to PATH”。验证安装:终端输入 git --version 显示版本…...
python——学生管理系统
学生管理系统主要分为以下三个大类: 一、用户类(User): 属性:用户名(username)、密码(password) 功能:注册(register)、登录&#…...