密码学中的盐值是什么?
目录
1. 盐值的基本概念
2. 盐值的作用
(1) 防止彩虹表攻击
(2) 防止相同的密码生成相同的哈希值
(3) 增加暴力破解的难度
3. 如何使用盐值?
(1) 生成盐值
(2) 将盐值附加到密码
(3) 存储盐值和哈希值
(4) 验证密码
4. 盐值如何增加暴力破解的难度
在线暴力破解
定义
盐值的作用
离线暴力破解
定义
盐值的作用
(1) 防止彩虹表攻击
(2) 增加暴力破解的复杂性
(3) 避免相同的密码产生相同的哈希值
5. 盐值泄与密码哈希值存在一起(比如存在一张表中),泄露了怎么办?
即使盐值泄露,其作用依然重要
(1) 增加暴力破解的时间和资源消耗
(2) 防止相同密码产生相同的哈希值
(3) 提高计算成本
综合防御策略
(1) 使用强哈希算法
(2) 多因素认证(MFA)
(3) 安全审计和监控
(4) 数据加密
6. 盐值的核心意义
7. 盐值的最佳实践
8. 总结
盐值(Salt) 是密码学中的一个概念,指的是一段随机生成的数据,通常用于增强密码哈希的安全性。它的主要作用是防止某些类型的攻击(如彩虹表攻击和预计算攻击),并确保即使两个用户使用相同的密码,它们的哈希值也会不同。
以下是关于盐值的详细解释:
1. 盐值的基本概念
- 定义: 盐值是一个随机生成的字符串或数字,附加到用户的密码(或其他敏感数据)上,然后再进行哈希运算。
- 特点:
- 每个用户的盐值通常是唯一的,即使两个用户使用相同的密码,最终的哈希值也会不同。
- 盐值不需要保密,通常与哈希值一起存储在数据库中。
2. 盐值的作用
盐值的主要目的是提高密码哈希的安全性,具体体现在以下几个方面:
(1) 防止彩虹表攻击
- 彩虹表 是一种预先计算好的哈希值表,用于快速反推出原始密码。
- 如果没有盐值,攻击者可以使用彩虹表轻松查找常见的密码哈希值。
- 加入盐值后,攻击者需要为每个盐值重新生成一个新的彩虹表,这大大增加了攻击的复杂性和成本。
(2) 防止相同的密码生成相同的哈希值
- 如果两个用户使用相同的密码,而没有盐值,他们的哈希值会完全相同。
- 这会让攻击者更容易发现哪些用户使用了相同的密码。
- 使用盐值后,即使密码相同,由于盐值不同,最终的哈希值也会不同。
示例:
用户A: 密码 = "123456", 盐值 = "abc123"
用户B: 密码 = "123456", 盐值 = "xyz789"哈希("123456" + "abc123") ≠ 哈希("123456" + "xyz789")
(3) 增加暴力破解的难度
- 攻击者如果想暴力破解密码,必须针对每个用户的盐值单独计算哈希值,而不是一次性破解所有用户。
- 这显著增加了破解所需的时间和资源。
3. 如何使用盐值?
以下是使用盐值的基本步骤:
(1) 生成盐值
- 盐值应该是一个足够长且随机的字符串。
- 可以使用加密安全的随机数生成器(如 .NET 中的
RNGCryptoServiceProvider
或RandomNumberGenerator
)生成盐值。
示例代码(C#):
using System;
using System.Security.Cryptography;class Program
{static void Main(){byte[] salt = GenerateSalt(16); // 生成 16 字节的盐值Console.WriteLine(Convert.ToBase64String(salt));}static byte[] GenerateSalt(int length){byte[] salt = new byte[length];using (var rng = RandomNumberGenerator.Create()){rng.GetBytes(salt);}return salt;}
}
(2) 将盐值附加到密码
- 在对密码进行哈希之前,将盐值附加到密码上。
- 示例:
hash = HashFunction(password + salt)
。
(3) 存储盐值和哈希值
- 将盐值和哈希值一起存储在数据库中。
- 示例:
用户表
-----------------------------------
用户名 | 盐值 | 哈希值
-----------------------------------
Alice | abc123 | hash1
Bob | xyz789 | hash2
(4) 验证密码
- 当用户登录时,从数据库中读取盐值,并将其与用户输入的密码组合后重新计算哈希值。
- 如果新计算的哈希值与存储的哈希值匹配,则验证成功。
示例代码(C#):
using System;
using System.Security.Cryptography;
using System.Text;class Program
{static void Main(){string password = "123456";byte[] salt = GenerateSalt(16);string hashedPassword = HashPassword(password, salt);Console.WriteLine("盐值: " + Convert.ToBase64String(salt));Console.WriteLine("哈希值: " + hashedPassword);// 验证密码bool isValid = VerifyPassword(password, salt, hashedPassword);Console.WriteLine("密码验证结果: " + isValid);}static byte[] GenerateSalt(int length){byte[] salt = new byte[length];using (var rng = RandomNumberGenerator.Create()){rng.GetBytes(salt);}return salt;}static string HashPassword(string password, byte[] salt){using (var sha256 = SHA256.Create()){byte[] passwordBytes = Encoding.UTF8.GetBytes(password);byte[] combined = new byte[passwordBytes.Length + salt.Length];Buffer.BlockCopy(passwordBytes, 0, combined, 0, passwordBytes.Length);Buffer.BlockCopy(salt, 0, combined, passwordBytes.Length, salt.Length);byte[] hash = sha256.ComputeHash(combined);return Convert.ToBase64String(hash);}}static bool VerifyPassword(string password, byte[] salt, string storedHash){string computedHash = HashPassword(password, salt);return computedHash == storedHash;}
}
4. 盐值如何增加暴力破解的难度
对信息系统中用户密码进行暴力破解通常由两种方式:在线暴力破解和离线暴力破解,盐值的意义更多体现在离线暴力破解中。
在线暴力破解
定义
- 攻击者通过系统的登录界面,不断尝试不同的用户名和密码组合,直到找到正确的凭证。
- 这种方式依赖于系统的响应速度和账户锁定策略。
盐值的作用
- 对在线暴力破解的影响较小: 盐值确实不会直接影响这种类型的攻击,因为攻击者只是通过正常的登录接口进行尝试。
- 其他防御机制更重要: 防御在线暴力破解通常依赖于以下措施:
- 账户锁定机制: 如果连续多次输入错误密码,则暂时锁定账户。
- 速率限制(Rate Limiting): 限制单位时间内允许的登录尝试次数。
- 多因素认证(MFA): 增加额外的安全层,即使密码被猜中,攻击者也无法仅凭密码登录。
因此,在线暴力破解确实不是盐值的主要应用场景。
离线暴力破解
定义
- 攻击者已经获取了系统的数据库(例如通过 SQL 注入或其他漏洞),并获得了存储的密码哈希值。
- 攻击者利用计算资源对这些哈希值进行暴力破解,试图还原原始密码。
盐值的作用
在这种情况下,盐值的作用变得至关重要:
(1) 防止彩虹表攻击
- 彩虹表是一种预先计算好的哈希值表,用于快速反推出常用密码。
- 如果没有盐值,攻击者可以直接使用彩虹表查找哈希值对应的明文密码。
- 使用盐值后,每个用户的密码哈希都加入了唯一的随机值(盐值),使得彩虹表失效。攻击者必须为每个用户重新生成一个新的彩虹表,这极大地增加了攻击成本。
(2) 增加暴力破解的复杂性
- 在没有盐值的情况下,攻击者可以批量尝试所有可能的密码组合,并一次性匹配多个用户的哈希值。
- 使用盐值后,攻击者必须针对每个用户的盐值单独计算哈希值。例如,如果系统中有 1000 个用户,攻击者需要为每个用户分别运行暴力破解算法,而不是一次性处理所有用户。
(3) 避免相同的密码产生相同的哈希值
- 如果两个用户使用相同的密码,且没有盐值,他们的哈希值会完全相同。一旦攻击者破解了一个用户的密码,就可以轻松推断出其他使用相同密码的用户。
- 使用盐值后,即使两个用户使用相同的密码,由于盐值不同,最终的哈希值也会不同,从而保护了其他用户的密码安全。
5. 盐值泄与密码哈希值存在一起(比如存在一张表中),泄露了怎么办?
即使盐值泄露,其作用依然重要
(1) 增加暴力破解的时间和资源消耗
- 单个用户的暴力破解: 当攻击者获取了某个用户的盐值和哈希值后,他们需要对该用户的特定盐值进行暴力破解。这意味着每次尝试都需要将密码与该用户的盐值结合后再进行哈希运算。
- 多个用户的暴力破解: 对于每一个用户,攻击者都需要重复上述过程。如果系统中有大量用户,攻击者就需要对每个用户分别进行暴力破解,而不是一次性处理所有用户。
示例: 假设一个系统有 1000 个用户,每个用户使用不同的盐值。攻击者想要暴力破解这些用户的密码:
- 无盐值: 攻击者只需计算一次哈希值,然后在所有用户的哈希值中查找匹配项。
- 有盐值: 攻击者需要对每个用户的盐值单独计算哈希值,这意味着需要进行 1000 次独立的暴力破解尝试。
(2) 防止相同密码产生相同的哈希值
- 如果两个用户使用相同的密码,且没有盐值,他们的哈希值会完全相同。一旦攻击者破解了一个用户的密码,就可以轻松推断出其他使用相同密码的用户。
- 使用盐值后,即使两个用户使用相同的密码,由于盐值不同,最终的哈希值也会不同,从而保护了其他用户的密码安全。
(3) 提高计算成本
- 强哈希算法(如 PBKDF2、bcrypt、scrypt 或 Argon2)通常允许设置一个参数(称为“工作因子”或“迭代次数”),使得每次哈希计算都需要更多的计算资源。
- 结合盐值使用强哈希算法,可以在计算过程中引入额外的延迟,进一步增加暴力破解的成本。
示例:
// 使用 PBKDF2 和盐值的例子
using System;
using System.Security.Cryptography;
using System.Text;class Program
{static void Main(){string password = "myPassword";byte[] salt = GenerateSalt(16);string hashedPassword = HashPasswordWithSalt(password, salt, iterations: 10000);Console.WriteLine("盐值: " + Convert.ToBase64String(salt));Console.WriteLine("哈希值: " + hashedPassword);}static byte[] GenerateSalt(int length){byte[] salt = new byte[length];using (var rng = RandomNumberGenerator.Create()){rng.GetBytes(salt);}return salt;}static string HashPasswordWithSalt(string password, byte[] salt, int iterations){using (var pbkdf2 = new Rfc2898DeriveBytes(password, salt, iterations)){byte[] hash = pbkdf2.GetBytes(32); // 256-bit hashbyte[] combined = new byte[salt.Length + hash.Length];Buffer.BlockCopy(salt, 0, combined, 0, salt.Length);Buffer.BlockCopy(hash, 0, combined, salt.Length, hash.Length);return Convert.ToBase64String(combined);}}
}
综合防御策略
尽管盐值和哈希值一起存储在数据库中,但为了进一步提升安全性,通常还会结合以下措施:
(1) 使用强哈希算法
- 如前所述,强哈希算法(PBKDF2、bcrypt、scrypt 或 Argon2)通过多次迭代哈希计算,显著增加暴力破解的时间。
- 这些算法还允许调整“工作因子”,以适应硬件性能的提升。
(2) 多因素认证(MFA)
- 即使密码被破解,多因素认证可以提供额外的安全层,要求用户提供第二种验证方式(如短信验证码、电子邮件验证码或指纹识别)。
(3) 安全审计和监控
- 实施定期的安全审计和监控,及时发现并修复潜在的安全漏洞,减少数据库泄露的风险。
(4) 数据加密
- 对敏感数据(包括盐值和哈希值)进行加密存储,即使数据库被泄露,攻击者也无法轻易访问这些信息。
6. 盐值的核心意义
盐值的主要作用是增强离线攻击的难度。它并不会直接防止在线暴力破解,但可以显著提高离线暴力破解的成本和复杂性。以下是盐值的核心意义总结:
- 防止彩虹表攻击: 让预计算攻击失效。
- 增加暴力破解的复杂性: 攻击者需要针对每个用户单独破解。
- 避免相同的密码产生相同的哈希值: 即使多个用户使用相同的密码,也不会暴露这一事实。
7. 盐值的最佳实践
为了确保盐值的有效性,以下是一些最佳实践:
- 盐值长度 : 盐值的长度应足够长(如 16 字节或更多),以增加攻击者的破解难度。
- 唯一性 : 每个用户的盐值应该是唯一的,即使两个用户使用相同的密码。
- 随机性 : 盐值应由加密安全的随机数生成器生成,避免使用简单的伪随机数生成器。
- 存储方式 : 盐值可以直接存储在数据库中,无需加密。它本身并不需要保密。
8. 总结
- 盐值 是一段随机数据,用于增强密码哈希的安全性。
- 它的主要作用是防止彩虹表攻击、防止相同的密码生成相同的哈希值,并增加暴力破解的难度。
- 使用盐值时,应确保其长度足够长、唯一且随机,并与哈希值一起存储。
相关文章:
密码学中的盐值是什么?
目录 1. 盐值的基本概念 2. 盐值的作用 (1) 防止彩虹表攻击 (2) 防止相同的密码生成相同的哈希值 (3) 增加暴力破解的难度 3. 如何使用盐值? (1) 生成盐值 (2) 将盐值附加到密码 (3) 存储盐值和哈希值 (4) 验证密码 4. 盐值如何增加暴力破解的难度 在线暴…...
[工具]Java xml 转 Json
[工具]Java xml 转 Json 依赖 <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.37</version> </dependen…...
安全光幕的CE认证
在工业自动化飞速发展的当下,安全光幕作为保障操作人员安全的关键设备,其重要性不言而喻。对于想要进军欧盟市场的安全光幕制造商来说,CE 认证是必须跨越的一道关卡。今天,我们就来深入探讨安全光幕的 CE 认证流程。 什么是安全…...
DNS解析失败怎么解决?
在互联网时代,畅快地浏览网页、使用各类网络服务已成为生活常态。然而,当屏幕突然弹出 “DNS解析失败”的提示,原本顺畅的网络连接戛然而止,让人倍感困扰。DNS即域名系统,它如同互联网的 “电话簿”,负责将…...
亚马逊商品详情API数据接口概述,Amazon API
亚马逊商品详情API数据接口概述 亚马逊商品详情API(如Amazon Product Advertising API或Selling Partner API (SP-API))是亚马逊为开发者提供的官方接口,允许通过编程方式获取商品的详细信息,包括商品标题、价格、描述、图片、用…...
TCP/IP和UDP协议的发展历程
TCP/IP和UDP协议的发展历程 引言 互联网的发展史是人类技术创新的辉煌篇章,而在这一发展过程中,通信协议发挥了奠基性的作用。TCP/IP(传输控制协议/互联网协议)和UDP(用户数据报协议)作为互联网通信的基础…...
LeetCode 259 题全解析:Swift 快速找出“满足条件”的三人组
文章目录 摘要描述示例 1:示例 2:示例 3: 题解答案(Swift)题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 本文围绕 LeetCode 259 题“较小的三数之和”,通过 Swift 给出两种解法,并…...
【MySQL】MySQL表的增删改查(CRUD) —— 上篇
目录 MySQL表的增删改查(CRUD) 1. 新增(Create)/插入数据 1.1 单行数据 全列插入 insert into 表名 values(值, 值......); 1.2 单行数据 指定列插入 1.3 多行数据 指定列插入 1.4 关于时间日期(datetime&am…...
基于大模型的腹股沟疝诊疗全流程风险预测与方案制定研究报告
目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与创新点 二、大模型技术概述 2.1 大模型基本原理 2.2 常用大模型类型及特点 2.3 大模型在医疗领域的应用潜力 三、腹股沟疝诊疗流程分析 3.1 腹股沟疝的发病机制与分类 3.2 传统术前评估方法与局…...
使用nssm将Nginx配置为Windows服务
使用nssm将Nginx配置为Windows服务 下载nssm工具 :使用NSSM创建服务启动并验证服务管理服务(启动/停止/重启) 下载nssm工具 : nssm下载网址 下载到指定路径下,解压就行。 使用NSSM创建服务 winr打开运行命令框&am…...
(8)VTK C++开发示例 --- 交互式3D部件
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 这个例子介绍了3D小部件(vtkBoxWidget)。3D小部件利用了前面介绍的事件/观察者设计模式。它们…...
ReAct、CoT 和 ToT:大模型提示词推理架构的对比分析
ReAct、CoT 和 ToT:大模型提示词推理架构的对比分析 在大型语言模型(LLM)的研究与应用中,如何有效提升模型在复杂任务上的推理能力是关键问题之一。目前,ReAct(Reasoning and Acting)、CoT&…...
Evidential Deep Learning和证据理论教材的区别(主要是概念)
最近终于彻底搞懂了Evidential Deep Learning,之前有很多看不是特别明白的地方,原来是和证据理论教材(是的,不只是国内老师写的,和国外的老师写的教材出入也比较大)的说法有很多不一样,所以特地…...
golang context源码
解析 context结构 Deadline:返回 context 的过期时间; Done:返回 context 中的 channel; Err:返回错误; Value:返回 context 中的对应 key 的值. type Context interface {Deadline() (deadl…...
VSCODE插值表达式失效问题
GET https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js net::ERR_CONNECTION_-CSDN博客 更换正确的vue域名 GET https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js net::ERR_CONNECTION_ <script src"https://unpkg.com/vue2.6.14/dist/vue.js"></sc…...
6.VTK 颜色
文章目录 概念RGB示例HSV示例 概念 RGB颜色系统:通过红(R)、绿(G)、蓝(B)三个颜色分量的组合来定义颜色。每个分量的取值范围是0到1,其中(0, 0, 0)代表黑色,而(1, 1, 1)代表白色。可以使用vtkProperty::SetColor(r, g, b)方法为Actor设置颜色…...
MQTTClient.c的线程模型与异步事件驱动
MQTTClient.c的线程模型与异步事件驱动 1. 多线程架构设计 MQTTClient.c通过分离网络I/O和用户逻辑线程实现异步通信,核心设计如下: sequenceDiagramparticipant 主线程 as 主线程(用户调用)participant 发送队列 as 发送队列pa…...
Flutter异常Couldn‘t find dynamic library in default locations
Flutter项目在Windows系统使用ffigen生成代码时报下面的错误: [SEVERE] : Couldnt find dynamic library in default locations. [SEVERE] : Please supply one or more path/to/llvm in ffigens config under the key llvm-path. Unhandled exception: Exception: …...
在PyCharm中部署AI模型的完整指南
引言 随着人工智能技术的快速发展,越来越多的开发者开始将AI模型集成到他们的应用程序中。PyCharm作为一款强大的Python IDE,为AI开发提供了出色的支持。本文将详细介绍如何在PyCharm中部署AI模型,从环境配置到最终部署的完整流程。 第一部分:准备工作 1. 安装PyCharm …...
6.6.图的广度优先遍历(英文缩写BFS)
树是一种特殊的图,树的广度优先遍历即层次遍历,所以会从树的角度入手图的广度优先遍历: BFS与DFS的区别在于,BFS使用了队列,DFS使用了栈 一.广度优先遍历: 1.树的广度优先遍历: 详情见"…...
练习(杨辉三角、字符串旋转)
一、 以下程序执行的结果: int main() {//0~255unsigned char a 200;//00000000000000000000000011001000//11001000 - a 截断unsigned char b 100;//00000000000000000000000001100100//01100100 - b unsigned char c 0;c a b;//11001000 - a//0110010…...
L1-7 矩阵列平移
题目 给定一个 nn 的整数矩阵。对任一给定的正整数 k<n,我们将矩阵的偶数列的元素整体向下依次平移 1、……、k、1、……、k、…… 个位置,平移空出的位置用整数 x 补。你需要计算出结果矩阵的每一行元素的和。 输入格式: 输入第一行给出…...
webgl入门实例-11模型矩阵 (Model Matrix)基本概念
WebGL 模型矩阵 (Model Matrix) 在WebGL和3D图形编程中,模型矩阵(Model Matrix)是将物体从局部坐标系(模型空间)转换到世界坐标系的关键变换矩阵。 什么是模型矩阵? 模型矩阵是一个4x4的矩阵,用于表示物体在世界空间中的位置、旋转和缩放。…...
【漫话机器学习系列】209.均值的标准误差(Standard Error of the Mean)
均值的标准误差(Standard Error of the Mean)详解 在统计学中,我们经常会遇到“均值的标准误差”这个概念,英文称为 Standard Error of the Mean(简称 SEM)。它是对样本均值作为总体均值估计的可靠程度的一…...
Multi Agents Collaboration OS:文档合规性及质量检测助手设计及实践
文档审查及质量检测背景 随着企业运营和知识管理的日益复杂,文档的合规性与质量成为确保信息准确、流程顺畅及风险控制的关键环节。传统上,人工进行文档的合规性和质量检测不仅耗时耗力,且易受主观因素影响,难以保证检测的全面性…...
Vue Teleport 及其在 SSR 中的潜在问题
Vue 3 的 Teleport 特性为开发者提供了更灵活的 DOM 结构控制能力,但在服务端渲染(SSR)场景中,它可能引发一些需要注意的问题。本文将深入探讨 Teleport 的核心机制及其在 SSR 中的使用陷阱。 一、Teleport 核心机制解析 1. 基本…...
Fastapi 日志处理
uvicorn 日志处理总结: 一、日志的结构 日志结构如下: {"version": 1,"disable_existing_loggers": false,"formatters": {},"handlers": {},"loggers": {} }loggers 用于定义日志处理最顶层的标识…...
FME实现矢量建筑面shp拉伸并贴纹理
文章目录 效果2、数据准备3、整理流程图4、操作步骤4.1 打开软件4.2 添加shp数据4.3 添加Extruder转换器4.4 添加AppearanceSetter转换器4.5 添加png纹理数据4.6 添加输出节点4.7 添加Logger节点4.8 执行5、执行结果效果 2、数据准备 (1)建筑面shp (2)纹理 test.png 其中s…...
仿腾讯会议项目实现——设置配置文件
目录 1、初始化配置 2、实现初始化配置的函数 3、修改配置文件内的ip地址 1、初始化配置 Ckernel.h 2、实现初始化配置的函数 3、修改配置文件内的ip地址 首先修改IP 运行出现设置的IP, 找到运行的配置文件,修改成自己当前的ip 将函数运行条件改成非…...
1187. 【动态规划】竞赛总分
题目描述 学生在我们USACO的竞赛中的得分越多我们越高兴。我们试着设计我们的竞赛以便人们能尽可能的多得分。 现在要进行一次竞赛,总时间T固定,有若干类型可选择的题目,每种类型题目可选入的数量不限,每种类型题目有一个si(解答…...
从零开始学Python游戏编程31-类3
2.6 run()方法 run()方法的作用是在while循环中调用以上方法,运行游戏。代码如图11所示。 图11 run()方法代码 其中,第43行控制while循环的是实例属性running,在图7所示的__init__()方法中定义;第44-46行代码分别调用了processI…...
Transformer 架构 - 解码器 (Transformer Architecture - Decoder)
一、解码器整体结构:多层堆叠设计 Transformer解码器由N个相同结构的解码器层堆叠而成(通常N=6),每层包含三个核心子模块(图1) 1 5 12 : 带掩码的多头自注意力层(Masked Multi-Head Self-Attention)编码器-解码器注意力层(Encoder-Deco…...
解锁健康生活:养生新主张
在生活节奏日益加快的当下,健康养生不再是中老年人的专属话题,越来越多的人开始意识到,它是维持生命活力、抵御疾病的重要保障。 中医养生讲究 “药食同源”,在饮食上,我们可以根据季节变化调整食谱。春天气候多变&…...
__call__ 方法
__call__ 是 Python 中的一个魔法方法,也称为类方法。 它的作用是将类的实例变成可调用对象,类似于像函数一样被调用。 __call__ 使用举例 class MyClass:def __call__(self, x, y):return x yobj MyClass() print(obj(1, 2)) 对比其他类/对象的使用…...
济南通过首个备案生活服务大模型,打造行业新标杆
近日,一则振奋人心的消息在人工智能领域传开:济南本土企业丽阳神州智能科技有限公司自主研发的 “丽阳雨露” 大模型成功通过国家网信办的备案。这一成果不仅是济南企业在科技创新道路上的重大突破,更标志着我国在生活服务领域的人工智能应用…...
UE5有些场景的导航生成失败解决方法
如果导航丢失,就在项目设置下将: 即可解决问题: 看了半个小时的导航生成代码发现,NavDataSet这个数组为空,导致异步构建导航失败。 解决 NavDataSet 空 无法生成如下: 当 NavDataSet 为空的化 如果 bAut…...
STM32使用rand()生成随机数并显示波形
一、随机数生成 1、加入头文件:#include "stdlib.h" 2、定义一个用作生成随机数种子的变量并加入到滴答定时器中不断自增:uint32_t run_times 0; 3、设置种子:srand(run_times);//每次生成随机数前调用一次为佳 4、生成一个随…...
继承的了解与学习
目录 1. 继承的概念及定义 1.1 继承的概念 1.2继承的名称 1.3继承方式 1.4继承类模板 2.基类和派生类之间的转化 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6.继承与静态函数 7.多继承与其菱形继承问题 8.虚继承 9.继承和组合 1. 继承的概念及定义 …...
如何精通C++编程?
如果从学生时代算起的话,我学习和使用C已经差不多快十年了,仍然不敢说自己已经掌握了C的全部特性,但或许能够给出一些有用的建议吧。 我学习C全靠自学,花费了不少的功夫,在这里分享一些学习心得,希望对大家…...
【科研绘图系列】R语言绘制多个气泡图组合图(bubble plot)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图函数画图系统信息介绍 【科研绘图系列】R语言绘制多个气泡图组合图(bubble plot) 加载R包 library(dplyr) library(tidyr) library(ggp…...
利用大模型实现地理领域文档中英文自动化翻译
一、 背景描述 在跨国性企业日常经营过程中,经常会遇到专业性较强的文档翻译的需求,例如法律文书、商务合同、技术文档等;以往遇到此类场景,企业内部往往需要指派专人投入数小时甚至数天来整理和翻译,效率低下&#x…...
Oracle 19c部署之手工建库(四)
#Oracle #19c #手工建库 手工创建Oracle数据库(也称为手工建库)是指在已经安装了Oracle数据库软件的基础上,通过手动执行一系列命令和步骤来创建一个新的数据库实例。这种方法与使用Database Configuration Assistant (DBCA)等工具自动创建数…...
Leetcode 2158. 每天绘制新区域的数量【Plus题】
1.题目基本信息 1.1.题目描述 有一幅细长的画,可以用数轴来表示。 给你一个长度为 n 、下标从 0 开始的二维整数数组 paint ,其中 paint[i] [starti, endi] 表示在第 i 天你需要绘制 starti 和 endi 之间的区域。 多次绘制同一区域会导致不均匀&…...
使用最新threejs复刻经典贪吃蛇游戏的3D版,附完整源码
基类Entity 建立基类Entity,实现投影能力、动画入场效果(从小变大的弹性动画)、计算自己在地图格位置的方法。 // 导入gsap动画库(用于创建补间动画) import gsap from gsap// 定义Entity基类 export default class …...
Google优化搜索体验:全新动态摘要功能(Beta)为欧洲用户带来更丰富的结果
Google持续推动搜索体验的创新,最新推出的动态摘要(Dynamic Snippets)功能(Beta版)为欧洲经济区(EEA)的用户和企业带来了全新的交互方式。2025年4月,Google更新了动态摘要的文档&…...
[苍穹外卖 | 项目日记] 第三天
前言 实现了新增菜品接口实现了菜品分页查询接口实现了删除菜品接口实现了根据id查询菜品接口实现了修改菜品接口 今日收获: 今日的这几个接口其实和之前写的对员工的操作是一样的,都是一整套Curd操作,所以今天在技术层面上并没有…...
【Python爬虫基础篇】--2.模块解析
目录 1.urllib库 1.1.request模块 1.1.1、urllib.request.urlopen() 函数 1.1.2.urllib.request.urlretrieve() 函数 1.2. error模块 1.3. parse 模块 2. BeautifulSoup4库 2.1.对象种类 2.2.对象属性 2.2.1.子节点 2.2.2.父节点 2.2.3.兄弟节点 2.2.4.回退和前进 …...
LabVIEW技巧——获取文件版本信息
获取可执行文件(exe)版本信息的几种方法 方法1. LabVIEW自带函数 labview自带了获取文件版本号的VI,但是没有开放到程序框图的函数选板中,在该目录下可以找到:...\LabVIEW 20xx\vi.lib\Platform\fileVersionInfo.llb…...
【软件工程】用飞书画各种图(流程图,架构图···)
笔者在做服务外包大赛的时候被文档内容的编写反复折磨,网上的工程图绘画工具要么是展示效果不佳,要么要收大几百的VIP费,最后发现飞书竟然可以直接绘画并插入示意图。 一、为什么选择飞书文档画流程图? 完全免费,无广…...
RFID图书管理系统如何重构数字化仓储管理新生态
引言 在图书馆与出版行业数字化转型进程中,RFID图书管理系统正打破传统人工管理的效率瓶颈,通过与数字化仓储管理系统的深度融合,实现从图书采购、入库到借阅的全链路智能化。本文结合RFID固定资产管理软件的应用逻辑,解析这一技…...