当前位置: 首页 > news >正文

Cryptography 与 PyCryptodome 源码级解析

目录

  • Cryptography 与 PyCryptodome 源码级解析
    • 一、引言
    • 二、Cryptography 库源码解析
      • 2.1 Cryptography 库概述与设计理念
      • 2.2 核心模块与数据流分析
        • 2.2.1 目录结构与模块划分
        • 2.2.2 以 AES-GCM 模式为例的加解密实现
        • 2.2.3 源码示例解析
      • 2.3 错误处理与边界检测
    • 三、PyCryptodome 源码解析
      • 3.1 PyCryptodome 库概述与发展历程
      • 3.2 核心模块与代码结构
      • 3.3 以 AES 加密模块为例的源码剖析
        • 3.3.1 AES 模块整体结构
        • 3.3.2 代码示例与解析
        • 3.3.3 错误处理与边界检测
      • 3.4 非对称加密模块解析
    • 四、两大库设计对比与安全性评估
      • 4.1 API 设计与模块化结构
      • 4.2 错误处理与边界检测对比
      • 4.3 性能与安全性评估
      • 4.4 实际应用中的选择建议
    • 五、总结与未来展望
      • 5.1 源码解析启示
      • 5.2 未来发展方向
      • 5.3 总结
    • 六、结语


Cryptography 与 PyCryptodome 源码级解析

一、引言

在现代信息安全领域,密码学库扮演着至关重要的角色。Python 生态中,CryptographyPyCryptodome 是两款广泛应用的密码学工具库,它们分别代表了不同的设计理念与实现方式。Cryptography 库以其优雅的 API 与对 OpenSSL 的依赖,保证了成熟稳定的安全性;而 PyCryptodome 则在继承 PyCrypto 的基础上进行了全面改进,提供了更丰富的功能与纯 Python 实现的优势。

本篇博客旨在从源码级别深入解析这两大库的内部实现。我们将从库的整体设计、模块划分、核心加密算法(例如对称加密中的 AES-GCM、非对称加密中的 RSA/ECC、哈希函数等)以及错误处理、边界检测等方面展开讨论。通过剖析关键代码与数据流程,探讨两者在安全性、性能和可扩展性上的设计取舍,为实际项目中如何正确使用和定制化改造提供理论与实践支持。

本文结构安排如下:

  1. Cryptography 库源码解析
    • 库概述与设计理念
    • 核心模块与数据流分析
    • 以 AES-GCM 为例的加解密实现剖析
  2. PyCryptodome 源码解析
    • 库的发展历程与设计目标
    • 模块划分与核心算法实现解析
    • 以对称加密与非对称加密为例的源码讲解
  3. 两大库设计对比与安全性评估
    • API 设计、错误处理、边界检测等方面的对比
    • 如何在实际应用中选择与定制适合自己的库
  4. 总结与未来展望

接下来,我们将逐步展开对两大库源码的详细解析。


二、Cryptography 库源码解析

2.1 Cryptography 库概述与设计理念

Cryptography 库是 Python 生态中使用最广泛的密码学库之一,其设计初衷在于为开发者提供一个安全、简洁且高效的加密接口。该库大部分功能依赖于 OpenSSL 提供的成熟实现,因此在安全性上有坚实的保障。其设计理念可以归纳为以下几点:

  • 安全性优先
    密码学算法的实现必须经过严格验证,Cryptography 通过封装 OpenSSL 以及 C 语言扩展,确保底层算法的正确性。加密与解密过程中的密钥管理、随机数生成等均严格遵循密码学标准。例如,AES-GCM 模式的加密过程可以用以下公式表示:
    C = A E S G C M ( K , N , M ) C = AES_{GCM}(K, N, M) C=AESGCM(K,N,M)
    其中 K K K 为密钥, N N N 为随机 nonce, M M M 为明文数据, C C C 为加密后的密文。

  • 模块化设计
    库内部采用模块化结构,将对称加密、非对称加密、哈希、签名以及证书管理等功能分离开来。这样不仅便于维护,也方便开发者根据需求进行定制和扩展。

  • 错误处理与边界检测
    为防止在使用过程中出现安全漏洞,Cryptography 库在每一个接口处都加入了严格的输入校验和错误处理机制,确保异常情况能被及时捕获并处理。

  • 跨平台兼容性
    尽管依赖 OpenSSL,但该库对 Windows、Linux、macOS 均有良好支持,设计时充分考虑平台相关的细节。

2.2 核心模块与数据流分析

2.2.1 目录结构与模块划分

Cryptography 的源码结构主要分布在以下几个核心目录中:

  • cryptography/hazmat/primitives
    包含各种密码学原语的实现,如对称加密(ciphers)、非对称加密、哈希、密钥派生函数(KDF)等。

  • cryptography/hazmat/backends
    该目录下主要包含对 OpenSSL 等底层库的封装实现。不同的后端(backend)负责调用具体的加密算法实现,确保与平台和 OpenSSL 版本的兼容性。

  • cryptography/x509
    负责证书的创建、解析与管理,支持 X.509 证书的全部功能。

这些模块之间通过统一的接口相互调用,构成了一个完整的密码学体系。数据流通常从高层 API 调用开始,经由相应的后端调用具体的 C 语言实现,最终返回经过处理的加密数据或验证结果。

2.2.2 以 AES-GCM 模式为例的加解密实现

在 Cryptography 库中,AES-GCM 模式的实现封装在 cryptography/hazmat/primitives/ciphers/aead.py 模块中。其大致流程如下:

  1. 密钥初始化
    根据传入密钥的长度(16、24、32 字节),初始化 AES 加密上下文。内部调用 OpenSSL 的 EVP_CIPHER_CTX_new() 等函数创建上下文。

  2. 随机 nonce 生成
    对于 GCM 模式,需要一个 12 字节的随机 nonce。库内部利用高质量随机数生成器(通常来自操作系统的 CSPRNG)生成该 nonce。

  3. 加密运算
    加密过程调用 OpenSSL 中的 EVP_EncryptInit_ex()EVP_EncryptUpdate()EVP_EncryptFinal_ex() 等函数。认证标签的计算则在 EVP_CIPHER_CTX_ctrl() 中设置相应参数完成。

  4. 解密运算
    解密过程中,先提取 nonce 与认证标签,再调用对应的解密接口,进行数据恢复和认证标签校验。若认证失败,函数将返回错误,确保数据完整性。

2.2.3 源码示例解析

以下代码片段展示了 Cryptography 库中 AES-GCM 加密部分的伪代码(实际源码在 C 层封装较多,但逻辑大致如此):

/* 伪代码:AES-GCM 加密核心流程 */
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (!ctx) {/* 错误处理:上下文分配失败 */
}if (EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, key, nonce) != 1) {/* 错误处理:初始化失败 */
}/* 加密数据 */
if (EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len) != 1) {/* 错误处理:加密更新失败 */
}/* 结束加密,获取剩余数据 */
if (EVP_EncryptFinal_ex(ctx, ciphertext + len, &final_len) != 1) {/* 错误处理:加密最终处理失败 */
}/* 获取认证标签 */
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, tag_len, tag) != 1) {/* 错误处理:获取标签失败 */
}EVP_CIPHER_CTX_free(ctx);

在 Python 层,Cryptography 的 API 封装了以上 C 接口,使得开发者只需调用简单的 Python 函数即可完成加密与解密操作。内部通过 CFFI 调用相应函数,确保效率与安全性。

2.3 错误处理与边界检测

Cryptography 在每个函数入口处都会对输入参数进行校验,例如密钥长度、nonce 长度、明文与密文的格式等。一旦发现异常,立即抛出异常信息,防止进一步执行导致安全隐患。与此同时,库在内部对所有 OpenSSL 返回值进行检查,确保调用成功后才进行后续步骤。

此外,对于认证加密模式(如 AES-GCM),在解密时若认证标签校验失败,库会直接抛出异常,提示数据完整性可能已被破坏。这种严格的边界检测为开发者提供了高可靠性的安全保障。


三、PyCryptodome 源码解析

3.1 PyCryptodome 库概述与发展历程

PyCryptodome 是对原 PyCrypto 库的全面重构与改进,旨在弥补 PyCrypto 长期未维护、存在安全漏洞等问题。其设计目标包括:

  • 纯 Python 与 C 混合实现
    在保持跨平台特性的同时,利用 C 扩展提高关键算法的执行效率。

  • 模块化与易用性
    将对称加密、非对称加密、哈希、随机数生成等功能拆分为独立模块,设计上力求接口简洁、使用方便。

  • 独立性与可扩展性
    不依赖 OpenSSL,降低外部依赖风险,同时支持多种加密算法,方便开发者在项目中按需选择。

  • 安全性与可靠性
    经过大量安全审计与社区反馈,修复了 PyCrypto 中存在的漏洞,确保在各种极端情况下都能稳定运行。

3.2 核心模块与代码结构

PyCryptodome 的源码主要分布在以下几个目录中:

  • Crypto/Cipher
    包含对称加密算法的实现,如 AES、DES、3DES、Blowfish 等。每个算法模块均实现了不同加密模式(ECB、CBC、CFB、OFB、CTR、GCM 等),并对密钥扩展、分组加密等过程进行了详细封装。

  • Crypto/PublicKey
    包含 RSA、DSA、ECC 等非对称加密算法的实现。源码中不仅包含基本的加密解密函数,还对签名、验证、密钥生成与导入导出等进行了全面支持。

  • Crypto/Hash
    实现了各种哈希函数(如 SHA 系列、MD5、RIPEMD 等),并保证满足“雪崩效应”和“抗碰撞性”等密码学要求。

  • Crypto/Random
    提供高质量随机数生成器,确保在密钥生成、nonce 生成等环节满足密码学随机性要求。

  • Crypto/Util
    包含辅助工具函数,如字节串与整数转换、填充算法等。

3.3 以 AES 加密模块为例的源码剖析

3.3.1 AES 模块整体结构

在 PyCryptodome 中,AES 加密模块主要位于 Crypto/Cipher/AES.py。其实现分为以下几部分:

  • 密钥扩展(Key Expansion)
    根据 AES 算法的要求,输入密钥(128、192、256 位)需要经过扩展生成轮密钥。源码中使用了固定的 S-box 与轮常数进行变换,确保扩展后的密钥满足密码学要求。公式上,扩展过程可以描述为:
    W [ i ] = W [ i − 4 ] ⊕ f ( W [ i − 1 ] ) W[i] = W[i-4] \oplus f(W[i-1]) W[i]=W[i4]f(W[i1])
    其中 $f$ 函数包含字节代换、循环移位和轮常数异或操作。

  • 分组加密实现
    对于每个明文分组,先进行初始轮密钥添加,再依次进行多轮的字节代换、行移位、列混合与轮密钥添加。源码中每一步都对应一个独立的函数,便于单独测试和错误定位。

  • 不同模式支持
    除了 ECB 模式外,模块还支持 CBC、CFB、OFB、CTR 等多种模式。以 CBC 模式为例,源码中实现了对前一分组密文与当前明文分组进行异或操作后再加密,过程如下:
    C i = E ( K , M i ⊕ C i − 1 ) C_i = E(K, M_i \oplus C_{i-1}) Ci=E(K,MiCi1)
    而初始向量 $IV$ 则由用户提供或由系统随机生成。

3.3.2 代码示例与解析

以下代码片段展示了 PyCryptodome 中 AES 模块的部分伪代码(部分内容经过简化,以便说明关键流程):

def _expand_key(key):# 计算轮数与轮密钥扩展,使用固定 S-box 和 Rcon 表round_keys = []# 初始轮密钥即原始密钥round_keys.extend(split_key(key))for i in range(4, total_rounds * 4):temp = round_keys[i - 1]if i % key_length == 0:temp = sub_word(rot_word(temp)) ^ rcon[i // key_length]round_keys.append(round_keys[i - key_length] ^ temp)return round_keysdef _encrypt_block(plaintext_block, round_keys):state = add_round_key(plaintext_block, round_keys[0])for rnd in range(1, total_rounds):state = sub_bytes(state)state = shift_rows(state)state = mix_columns(state)state = add_round_key(state, round_keys[rnd])# 最后一轮不进行 mix_columnsstate = sub_bytes(state)state = shift_rows(state)state = add_round_key(state, round_keys[total_rounds])return state

在这段代码中,函数 _expand_key 实现了 AES 密钥扩展算法,而 _encrypt_block 则完成了对单个 128 位分组的加密。每个步骤都对应着 AES 算法中的一个标准变换,确保在数学上满足 AES 设计的安全性要求。

3.3.3 错误处理与边界检测

在 PyCryptodome 的实现中,对输入参数的校验同样严格。例如,在初始化 AES 对象时,会检查密钥长度是否符合要求,若不符合则抛出 ValueError 异常。同时,对于数据块长度,若不足一块则调用相应的填充函数进行补全,这样既避免了边界错误,也确保了解密时数据能正确还原。

3.4 非对称加密模块解析

PyCryptodome 在非对称加密部分主要实现了 RSA 与 ECC 算法。在 RSA 模块中,源码包含如下核心部分:

  • 大数运算与模幂运算
    由于 RSA 的加密与解密过程依赖于大数运算,PyCryptodome 使用了经过优化的多精度整数库实现高效的模幂运算。公式上,RSA 加密过程为
    C = M e m o d n C = M^e \mod n C=Memodn
    而解密为
    M = C d m o d n M = C^d \mod n M=Cdmodn

  • 密钥生成与安全性考量
    在密钥生成时,源码中采用随机素数生成算法(如 Miller-Rabin 素性测试)来确保生成的素数足够随机和大,避免因低熵导致的安全隐患。

  • 签名与验证
    除了基本加解密功能,RSA 模块还支持基于 PKCS#1 等标准的数字签名和验证,实现了数字签名在真实场景中的应用。

类似地,ECC 模块则基于椭圆曲线离散对数问题构建,源码中详细实现了曲线参数的初始化、点乘、加法等运算,并对常见曲线(如 secp256k1、prime256v1 等)进行了封装。


四、两大库设计对比与安全性评估

4.1 API 设计与模块化结构

  • Cryptography 库
    采用高度封装的 API,隐藏了底层 OpenSSL 的细节,使开发者能够通过简单调用实现复杂的加密操作。其模块化设计清晰,用户只需关注高层 API,而不必关心内部细节。这种设计使得 Cryptography 在企业级应用中更为常见,但同时也意味着在需要做底层定制时,开发者选择余地较小。

  • PyCryptodome
    虽然同样提供了较为简洁的 API,但其源码更为透明,允许开发者在必要时直接查看并修改加密算法的具体实现。由于不依赖外部库(如 OpenSSL),在跨平台移植及定制化方面具有优势,但安全性完全依赖于自身代码的严格审计。

4.2 错误处理与边界检测对比

两大库在错误处理上均采用了严格的检测机制:

  • Cryptography 侧重于在调用 C 接口时检查返回值,并结合 CFFI 层对异常进行封装;
  • PyCryptodome 则更多依赖 Python 层的异常处理,通过对输入数据、密钥长度、填充方式等做全面校验,防止因非法输入引发漏洞。

在边界检测上,二者均保证在加密解密过程中,若出现认证失败或数据格式异常,都能及时中断操作并反馈异常,从而避免潜在的安全风险。

4.3 性能与安全性评估

  • 性能比较
    Cryptography 依赖 OpenSSL,因其底层 C 实现经过多年优化,在大多数平台上具有较高的性能。而 PyCryptodome 虽然在部分算法中也使用了 C 扩展,但在某些边缘情况下可能略逊一筹。不过,PyCryptodome 的优势在于独立性和对 Python 生态的深度定制,适合对安全性要求极高但对性能要求相对宽松的场景。

  • 安全性比较
    Cryptography 的安全性主要由 OpenSSL 提供保证,其源码经过全球大量安全专家的审核。PyCryptodome 则通过自有代码审计以及社区反馈不断修正漏洞。两者各有侧重,但总体上都能满足现代密码学体系中对数据机密性、完整性和认证性的要求。

4.4 实际应用中的选择建议

在实际项目中,如何选择合适的库取决于具体需求:

  • 若追求企业级稳定性与高性能,且项目环境允许使用 OpenSSL,Cryptography 是优选;
  • 若需要更高的定制化、独立性以及透明的源码审核过程,PyCryptodome 则提供了更灵活的解决方案。

此外,开发者也可结合两者优势,通过混合使用或自定义封装,构建出既满足安全要求又具备扩展性的加密系统。


五、总结与未来展望

5.1 源码解析启示

通过对 Cryptography 与 PyCryptodome 两大库的源码级解析,我们可以获得以下几点启示:

  • 严格的输入校验与错误处理
    两大库均在每个接口处对输入参数进行严格检测,防止非法数据进入加密流程。开发者在构建自有加密系统时,必须借鉴这一点,避免因边界检查疏漏而引发严重安全漏洞。

  • 模块化设计的重要性
    将加密算法、密钥管理、随机数生成、签名验证等功能模块化,不仅便于代码维护,也能在出现安全问题时迅速定位问题源。无论是 Cryptography 还是 PyCryptodome,都体现了这一设计理念。

  • 依赖与独立性的权衡
    Cryptography 依赖 OpenSSL 保证了高性能与成熟稳定,但也带来外部依赖风险;而 PyCryptodome 的独立实现虽然在某些性能指标上不如 OpenSSL,但提供了更高的代码透明度与可控性。实际开发中,如何在二者之间做出权衡,是每个工程师必须面对的问题。

  • 安全性与性能的平衡
    加密算法设计既要确保数学上不可破解,又要满足实时性要求。源码中对大数运算、模幂运算、密钥扩展等关键部分的高效实现,正是这种平衡的体现。理解这些底层实现,有助于开发者在遇到性能瓶颈时做出合理优化。

5.2 未来发展方向

随着信息技术的发展,密码学库的需求将变得越来越复杂,未来可能的发展方向包括:

  • 量子抗性算法的实现
    当前两大库主要实现传统密码学算法,但随着量子计算的逐步发展,如何在现有框架中引入量子抗性算法将成为一个重要课题。

  • 硬件加速与多平台优化
    利用 GPU、TPU 或专用加速卡进行密码学运算,将进一步提升加密解密效率。未来的库设计可能会更多地考虑硬件异构计算的支持。

  • API 标准化与跨语言支持
    随着微服务架构的普及,如何设计标准化 API 接口,方便不同语言与平台间的无缝协作,也是未来发展的一个方向。Cryptography 与 PyCryptodome 的源码设计均为此提供了有益的借鉴。

  • 自动化安全审计工具
    密码学库的安全性至关重要,如何利用自动化工具对源码进行持续审计与漏洞检测,将是保障系统安全的关键技术。

5.3 总结

本文从源码级角度,深入解析了 Cryptography 与 PyCryptodome 两大 Python 密码学库的设计与实现。通过对核心模块、关键算法、错误处理机制及边界检测策略的详细剖析,我们不仅揭示了两者在内部实现上的异同,也为开发者提供了构建安全可靠加密系统的实践指导。无论是在企业级应用中选用成熟的 Cryptography,还是在需要更高定制化的场景中采用 PyCryptodome,理解其内部实现机制都是提升安全性和性能的基础。

希望本文能帮助广大开发者更好地理解 Python 密码学库的内部结构,并在实际项目中根据自身需求做出最合适的选择。未来,随着新技术的不断涌现与安全标准的不断更新,我们也应持续关注源码层面的改进,确保系统始终处于安全、稳定和高效的状态。


六、结语

在构建安全系统的过程中,理解底层源码是确保系统安全性与高性能的重要前提。通过对 Cryptography 与 PyCryptodome 源码的详细剖析,我们不仅看到了两大库在设计理念与实现细节上的不同选择,也体会到了现代密码学工程师在追求安全与效率之间的艰难平衡。

未来,随着新技术、新需求的不断涌现,密码学库也必将不断进化。希望本文能为开发者提供有益的启示,激发更多关于安全性、性能优化与系统设计的讨论与实践,共同推动信息安全领域的发展与进步。


以上即为本次对 Cryptography 与 PyCryptodome 两大密码学库源码级解析的全部内容。欢迎大家在评论区交流讨论,共同探索密码学实现中的更多细节与优化思路。

相关文章:

Cryptography 与 PyCryptodome 源码级解析

目录 Cryptography 与 PyCryptodome 源码级解析一、引言二、Cryptography 库源码解析2.1 Cryptography 库概述与设计理念2.2 核心模块与数据流分析2.2.1 目录结构与模块划分2.2.2 以 AES-GCM 模式为例的加解密实现2.2.3 源码示例解析 2.3 错误处理与边界检测 三、PyCryptodome …...

std::string的模拟实现

目录 string的构造函数 无参数的构造函数 根据字符串初始化 用n个ch字符初始化 用一个字符串的前n个初始化 拷贝构造 用另一个string对象的pos位置向后len的长度初始化 [ ]解引用重载 迭代器的实现 非const版本 const版本 扩容reserve和resize reserve resize p…...

GPU、NPU与LPU:大语言模型(LLM)硬件加速器全面对比分析

引言:大语言模型计算基础设施的演进 随着大语言模型(LLM)的快速发展与广泛应用,高性能计算硬件已成为支撑LLM训练与推理的关键基础设施。目前市场上主要有三类处理器用于加速LLM相关任务:GPU(图形处理单元…...

常见限流算法

限流是指在高并发、大流量请求的情况下,限制新的流量对系统的访问,以保证系统服务的安全性。常见的限流算法及其详细介绍如下: 计数器算法(Fixed Window Counter) 原理:使用一个固定时间窗口内的计数器来…...

美国国家航空航天局(NASA)的PUNCH任务

地球浸没在来自太阳的物质流中。这种被称为太阳风的流正在冲刷我们的星球,造成令人叹为观止的极光,影响太空中的卫星和宇航员,甚至影响地面基础设施。 美国宇航局 (NASA) 的 PUNCH(统一日冕和日球层旋光仪 Polarimeter to Unify the Corona and Heliosphere)任务将首次…...

REST API前端请求和后端接收

1、get请求&#xff0c;带"?" http://localhost:8080/api/aop/getResult?param123 GetMapping("getResult")public ResponseEntity<String> getResult(RequestParam("param") String param){return new ResponseEntity<>("12…...

OpenBMC:BmcWeb构造connect对象

OpenBMC:BmcWeb server.run-CSDN博客 server在接收了tcp连接请求后,会构造一个ConnectionType对象,然后通过post调度,运行该对象的start函数 1.ConnectionType类型 其实也就是using ConnectionType = Connection<Adaptor, Handler>;类型 由于ConnectionType实例化于…...

ESLint 深度解析:原理、规则与插件开发实践

在前端开发的复杂生态中&#xff0c;保障代码质量与规范性是构建稳健、可维护项目的基石。ESLint 作为一款强大的代码检查工具&#xff0c;其默认规则与插件能满足多数常见需求&#xff0c;但面对特定团队规范或项目独特要求&#xff0c;自定义 ESLint 插件便成为有力的扩展手段…...

ios使用swift调用deepseek或SiliconFlow接口

调用SiliconFlow API 注册并获取API密钥&#xff1a;打开硅基流动平台官网Models&#xff0c;进行注册和认证。登录后&#xff0c;进入首页&#xff0c;点击左上角三个横杠&#xff0c;选择API密钥&#xff0c;生成密钥并复制。配置第三方应用&#xff1a;打开安装好的Chatbox…...

贪心算法一

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…...

Java进阶:Dubbo

分布式RPC框架Apache Dubbo 1. 软件架构的演进过程 软件架构的发展经历了由单体架构、垂直架构、SOA架构到微服务架构的演进过程&#xff0c;下面我们分别了解一下这几个架构。 1.1 单体架构 架构说明&#xff1a; 全部功能集中在一个项目内&#xff08;All in one&#xf…...

【Day9】make/makeFile如何让项目构建自动化起飞

【Day9】make/makeFile如何让项目构建自动化起飞 使用make命令编写makefile文件依赖管理增量构建makefile注释&#xff1a;#makefile其他语法 make/makefile递归式工作过程 在Linux中&#xff0c;项目自动化构建是指使用一系列工具和脚本来自动执行软件项目的编译、测试、打包和…...

SCI1区TOP:自适应学习粒子群算法SLPSO,深度解析+性能实测

目录 1.摘要2.改进策略3.自适应学习粒子群算法4.结果展示5.参考文献6.获取代码 1.摘要 粒子群算法&#xff08;PSO&#xff09;是一种基于种群的随机搜索方法&#xff0c;广泛应用于科学和工程领域的连续空间优化问题&#xff0c;并已证明其高效性和有效性。许多实际问题的往往…...

迷你世界脚本显示板管理接口:DisPlayBoard

显示板管理接口&#xff1a;DisPlayBoard 迷你世界 更新时间: 2023-04-26 10:21:14 具体函数名及描述如下: 序号 函数名 函数描述 1 showBoard(...) 对玩家显示显示板 2 hideBoard(...) 对玩家隐藏显示板 3 setBoardPicture 对玩家设置显示板的图片…...

如何使用 LLM 生成的术语自动在搜索应用程序上构建 autocomplete 功能

作者&#xff1a;来自 Elastic Michael Supangkat 了解如何在 Elastic Cloud 中&#xff0c;通过使用 LLM 生成的词汇&#xff0c;为搜索应用增强自动补全功能&#xff0c;实现更智能、更动态的搜索建议。 自动补全是搜索应用中的一项关键功能&#xff0c;它通过在用户输入时实…...

电路基础:【1】PN结二极管制作电桥点亮LED灯

第一章&#xff1a;PN结二极管制作电桥点亮LED灯 文章目录 第一章&#xff1a;PN结二极管制作电桥点亮LED灯前言一、电路原理二、电路图与元器件1.电路图 做实验总结 前言 在本章中&#xff0c;我们将探讨如何通过PN结二极管制作电桥电路&#xff0c;并利用该电路点亮LED灯。L…...

蓝桥与力扣刷题(蓝桥 门牌制作)

题目&#xff1a;小蓝要为一条街的住户制作门牌号。 这条街一共有 2020 位住户&#xff0c;门牌号从 1 到 2020编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符&#xff0c;最后根据需要将字符粘贴到门牌上&#xff0c;例如门牌 1017 需要依次粘贴字符 1、0、1、7&…...

unity console日志双击响应事件扩展

1 对于项目中一些比较长的日志&#xff0c;比如前后端交互协议具体数据等&#xff0c;这些日志内容可能会比较长&#xff0c;在unity控制面板上查看不是十分方便&#xff0c;我们可以对双击事件进行扩展&#xff0c;将日志保存到一个文本中&#xff0c;然后用系统默认的文本查看…...

基于Django创建一个WEB后端框架(DjangoRestFramework+MySQL)流程

一、Django项目初始化 1.创建Django项目 Django-admin startproject 项目名 2.安装 djangorestframework pip install djangorestframework 解释: Django REST Framework (DRF) 是基于 Django 框架的一个强大的 Web API 框架&#xff0c;提供了多种工具和库来构建 RESTf…...

unittest框架 核心知识的系统复习及与pytest的对比

1. unittest 介绍 是什么&#xff1a;Python 标准库自带的单元测试框架&#xff0c;遵循 xUnit 架构&#xff08;类似Java的JUnit&#xff09;。 核心概念&#xff1a; TestCase&#xff1a;测试用例的基类&#xff0c;所有测试类需继承它。 TestSuite&#xff1a;测试套件&a…...

嵌入式硬件设计SPI时需要注意什么?

嵌入式硬件设计SPI时需要注意什么? 1. 硬件设计注意事项 关键点注意事项1. 信号完整性- 缩短SCK、MOSI、MISO的走线长度,避免反射干扰。- 使用屏蔽线或差分信号(高速场景)。- 阻抗匹配(特别是高频信号,如50Ω端接)。2. 电源与地线- 电源去耦:每个SPI芯片的VCC附近放置0…...

vscode远程ssh链接服务器

前提&#xff1a;安装并配置好 ssh 服务,并且远程主机和本地主机在同一个局域网。 降级到1.85.2版本并禁用自动更新&#xff0c;因为最新的vscode不支持remote SSH。 【VS Code】VS Code不再支持remote SSH 1.在vscode 扩展中搜索Remote - SSH,下载安装扩展 2.点击 远程资源管理…...

97k倍区间

97k倍区间 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;暴力&#xff0c;2017省赛 &#x1f4d6; &#x1f4da; import java.util.Scanner;public class Main {static int N 100010;public static void main(String[] args) {Scanner sc new Scanner(System.…...

绝美焦糖暖色调复古风景画面Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 通过 Lr 软件丰富的工具和功能&#xff0c;对风景照片在色彩、影调等方面进行调整。例如利用基本参数调整选项&#xff0c;精准控制照片亮度、对比度、色温、色调等基础要素&#xff1b;运用 HSL 面板可对不同色彩的色相、饱和度以及明亮度进行单独调节&#xff1b;利…...

双王炸爆单,问界M8、M9怎么选?

文 | AUTO芯球 作者 | 雷慢 问界M8一小时小订7500台&#xff0c; 新问界M9一小时订单3800台。 余承东这次直接把一对王炸打了出来&#xff0c; 来看这对大小王&#xff0c; 问界M8预售价36.8万到45.8万&#xff0c; 问界M9预售价47.8万到57.8万&#xff0c; 这两款车&…...

【自学笔记】OpenStack基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 OpenStack基础知识点总览一、OpenStack概述1.1 OpenStack起源1.2 OpenStack的目标与优势1.3 OpenStack的常见核心项目 二、OpenStack的节点类型2.1 控制节点2.2 网络…...

同步 Fork 仓库的命令

同步 Fork 仓库的命令 要将您 fork 的仓库的 main 分支与原始仓库&#xff08;fork 源&#xff09;同步&#xff0c;您可以使用以下命令&#xff1a; 首先&#xff0c;确保您已经添加了原始仓库作为远程仓库&#xff08;如果尚未添加&#xff09;&#xff1a; git remote add…...

2025-03-04 学习记录--C/C++-C语言 判断是否是素数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; C语言 判断是否是素数 一、代码 ⭐️ #include <stdio.h> #include <stdbool.h> // 使用 bool 类型// 判断是否是…...

1、CI/CD 平台安装部署(Gitlab+Jenkins)

CI/CD 平台安装部署 安装部署Gitlab安装Gitlab添加组、创建用户、创建项目 Jenkins 安装Maven 安装和配置Tomcat 安装和配置Jenkins 构建 Maven 项目自由风格项目构建 什么是CI/CD&#xff1f; 通俗来说就是启动一个服务&#xff0c;能够监听代码变化&#xff0c;然后自动执行构…...

数据集路径出错.yaml‘ images not found , missing path

方法一&#xff1a;删除settings.yaml 方法二&#xff1a;dataset_name.yaml改用绝对路径&#xff0c;如最后一张图 错误分析&#xff1a; dataset_name.yaml中的path的路径仅支持绝对路径&#xff0c;写相对路径就会搜索不到&#xff0c;使用settings.json中的路径&#xff0…...

零基础学习Python 之类(Class)和实例(Instance)_我的学习Python记录12

零基础学习Python 之类&#xff08;Class&#xff09;和实例&#xff08;Instance&#xff09;_我的学习Python记录12 目录 什么是类和实例&#xff1f;类的作用如何定义类&#xff1f;如何创建实例&#xff1f;类的属性和方法 属性方法 实际案例 案例 1&#xff1a;学生信息…...

Map<String,Object>转换为XML报文的方法

1. 使用 JAXB (Java Architecture for XML Binding) JAXB 是 Java 标准库的一部分&#xff0c;支持将 Java 对象与 XML 相互转换。虽然 JAXB 主要用于将 Java 对象转换为 XML&#xff0c;但可以通过一些技巧将 Map<String, Object> 转换为 XML。 示例代码 import java…...

Linux:如何安装虚拟机

Linux&#xff1a;如何安装虚拟机 第一步首先打开阿里巴巴开源镜像网站然后点击相应要下载链接 选择自己需要的 这个是完整版 这个是联网进行安装系统 这个是基础版只有命令行界面 这里我选择下载基础版 下载好打开vmwareworkstation 开始安装...

HTML 编辑器推荐与 VS Code 使用教程

在进行 HTML 编程时&#xff0c;选择一款合适的 HTML 编辑器能极大地提高开发效率。以下为大家推荐几款常用且功能强大的 HTML 编辑器&#xff0c;同时详细介绍如何使用 VS Code 创建和预览 HTML 文件。 一、HTML 编辑器推荐 VS Code&#xff1a;由微软开发&#xff0c;是一款…...

Python的Pandas和matplotlib库:让数据可视化贼简单

在数据爆炸的时代&#xff0c;数据可视化已成为数据分析的关键环节。Python 作为强大的编程语言&#xff0c;拥有众多用于数据可视化的库&#xff0c;而 pandas 库在其中扮演着重要角色。它不仅能高效处理和分析数据&#xff0c;还具备强大的数据可视化功能&#xff0c;让我们轻…...

私有云基础架构与运维(二)

二.私有云基础架构 【项目概述】 经过云计算基础知识及核心技术的学习后&#xff0c;希望进一步了解 IT 基础架构的演变过 程&#xff0c;通过学习传统架构、集群架构以及私有云基础架构的相关知识&#xff0c;认识企业从传统 IT 基 础架构到私有云基础架构转型的必要性。…...

Java Maven 项目问题:org.dom4j:dom4j:pom:2.1.3 failed to transfer from...

问题与处理策略 问题描述 IDEA 中打开一个 Java 项目&#xff0c;使用 Maven 构建时&#xff0c;报如下错误 org.dom4j:dom4j:pom:2.1.3 failed to transfer from https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local r…...

DeepSeek group-limited expert routing和负载均衡

Ref https://github.com/deepseek-ai/DeepSeek-V3/blob/main/inference/model.py GitHub - deepseek-ai/EPLB: Expert Parallelism Load Balancer DeepSeek-V3 Technical Report DeepSeek的路由方法 class Gate(nn.Module):def __init__(self, args: ModelArgs):super().__…...

nvidia驱动升级-ubuntu 1804

升级 1.从官网下载*.run驱动文件 2.卸载原始驱动 sudo /usr/bin/nvidia-uninstall sudo apt-get --purge remove nvidia-\* # 可能不需要加-\ sudo apt-get purge nvidia-\* # 可能不需要加-\ sudo apt-get purge libnvidia-\* # 可能不需要…...

金融合规测试:金融系统稳健运行的“定海神针“

一、什么是金融合规测试&#xff1f; 金融行业是受监管最严格的领域之一&#xff0c;各国政府和监管机构&#xff08;如中国人民银行、银保监会、证监会、美国SEC、欧盟ESMA等&#xff09;都制定了严格的法律法规&#xff0c;要求金融机构确保系统安全、交易透明、公平竞争&am…...

[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑

参考原文&#xff1a;[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑 还在为多台电脑需要多套键盘鼠标而烦恼吗&#xff1f;是不是在操控 Windows、macOS、Linux 不同系统电脑时手忙脚乱&#xff1f;现在&#xff0c;这些问题通通能解决&#xff01;Deskflow 软件闪亮登…...

vue3 组合式API:透传 Attributes(v-bing与:)—setup() 上下文对象ctx.attrs

一、概念及举例说明透传 attribute与模板语法中的Attribute(v-bind) 透传 attribute:传递给一个组件没有通过 props 与 emits 的attribute或者v-on事件监听(常见的:calss、style、id) 举例:当一个组件以单个元素为根元素渲染时,透传 attribute 会自动被添加到根元素上 …...

记录一次利用条件索引优化接口性能的实践

一、业务背景 某表数据量达到4000w&#xff0c;需要每天定时任务处理20w条。前2周内SQL执行无任何问题&#xff0c;非常快&#xff0c;效率比较高。随着处理完的数据量变大&#xff0c;处理完数据状态设置为1&#xff0c;SQL执行效率越来越差&#xff0c;已经达到了惊人的4.6秒…...

Anaconda 部署 DeepSeek

可以通过 Anaconda 环境部署 DeepSeek 模型&#xff0c;但需结合 PyTorch 或 TensorFlow 等深度学习框架&#xff0c;并手动配置依赖项。 一、Anaconda 部署 DeepSeek 1. 创建并激活 Conda 环境 conda create -n deepseek python3.10 # 推荐 Python 3.8-3.10 conda activate…...

MATLAB中lookAheadBoundary函数用法

目录 语法 说明 示例 匹配指定模式之前的位置 匹配指定模式之前的边界以外的边界 lookAheadBoundary函数的功能是匹配指定模式之前的边界。 语法 newpat lookAheadBoundary(pat) 说明 newpat lookAheadBoundary(pat) 创建匹配 pat 的开头的模式。结果中不包含 pat 匹…...

Unity HDR颜色、基础颜色、强度强度、HDR面板Intensity之间的相互转换

目录 前言&#xff1a; 一、UnityHDR面板的规律 二、HDR与基础颜色转换&#xff0c;HDR强度获取&#xff0c;输入设置强度获取 1.基础色->HDR颜色 2.HDR颜色->基础色 3.获取HDR颜色在面板中的强度 4.获取HDR颜色在面板设置输入时的强度 前言&#xff1a; HDR&#…...

nvm 让 Node.js 版本切换更灵活

有很多小伙伴前端开发进程中&#xff0c;我们常常会遇到不同项目依赖不同版本 Node.js 的情况。我们不可能去卸载重新安装适应的版本去安装依赖或者启动项目。为了避免版本冲突带来的一系列麻烦&#xff0c;在这里给大家推荐一款Node.js 版本管理工具——nvm&#xff08;Node V…...

微机惊魂记

春天午后的阳光懒洋洋地洒在教学楼的走廊上&#xff0c;我跟着同学们排着队往四楼的微机教室走去。楼梯间的窗户开着&#xff0c;飘进来阵阵樱花的香气&#xff0c;让人昏昏欲睡。 微机教室在一栋普通的五层教学楼里&#xff0c;墙壁刷着淡绿色的漆&#xff0c;墙角还有些剥落…...

Windows下安装VMware Workstation 17并设置支持MacOS

VMware Workstation 17 介绍 VMware Workstation 17 是 VMware 公司推出的一款强大的桌面虚拟化软件&#xff0c;适用于 Windows 、 Linux 和FreeBSD等操作系统。它允许用户在单一物理计算机上创建、运行和管理多个虚拟机&#xff08;VM&#xff09;&#xff0c;每个虚拟机都可…...

[MySQL初阶]MySQL(5)内置函数详解

标题&#xff1a;[MySQL初阶]MySQL&#xff08;5&#xff09;内置函数详解 水墨不写bug 文章目录 一、日期函数1. current_date()2. current_time()3. current_timestamp()4. date(datetime)5. date_add(date, interval expr unit)6. date_sub(date, interval expr unit)7. dat…...