node.bcrypt.js 版本演进全解析:从 CHANGELOG 看 bcrypt 密码哈希库的关键修复与架构变迁
密码学【免费下载链接】node.bcrypt.jsbcrypt for NodeJs项目地址https://gitcode.com/gh_mirrors/no/node.bcrypt.js点击查看免费下载node.bcrypt.jsnpm 包名bcrypt是 Node.js 生态中最常用的 bcrypt 密码哈希实现本仓库当前版本为6.0.0。本文将以其 CHANGELOG.md 为脉络逐一解读从 v0.1.2 到 v6.0.0 每个版本背后的安全修复、API 变更与构建体系演进并结合仓库内的 C 源码src/bcrypt.cc、src/bcrypt_node.cc、测试用例test/与构建配置binding.gyp、package.json进行源码级佐证。读完本文你将理解为何必须升级到 v5.0.0、wrap-around 与 NUL 两个历史安全缺陷的根因与修复方式以及 prebuildify/N-API 架构迁移对安装体验的影响。一、为什么 CHANGELOG 值得精读两个至今影响你的历史安全缺陷CHANGELOG 中最重要的一条记录出现在v5.0.02020-06-02Fix the bcrypt wrap-around bug. It affects passwords with lengths 255. Fix a bug related to NUL in password input.这两行对应的两个安全缺陷是理解本库版本策略的钥匙wrap-around回绕缺陷当密码长度 ≥ 255 字节时旧实现会因整数回绕integer wraparound导致密码被截断长密码实际只被校验了极短前缀严重削弱安全性。NUL 缺陷密码内嵌\0NUL字符时旧实现会丢弃 NUL 之后的所有字符同样导致实际校验的内容远短于用户输入的密码。修复这两处的代码都在 src/bcrypt.cc 中if (minor a) key_len (u_int8_t)(key_len (minor a ? 1 : 0)); else { /* cap key_len at the actual maximum supported * length here to avoid integer wraparound */ if (key_len 72) key_len 72; key_len; /* include the NUL */ }关键变化是对于$2b$前缀的哈希密钥长度被显式封顶在72 字节并计入 NUL 结尾从根上消除了key_len参与运算时的整数回绕隐患。在$2a$分支下则维持旧行为以保持与既有哈希的兼容性。注意bcrypt 规范本身只使用输入的前 72 字节。注意是 72字节而非 72字符——一个包含 emoji 的 UTF-8 字符串可能不足 72 字符却超过 72 字节。字符串会按 UTF-8 编码处理。测试对这两个修复的验证test/implementation.test.js 中有专门的long_passwords和embedded_nulls用例test(long_passwords, () { // bcrypt wrap-around bug in $2a$ expect(bcrypt.hashSync(0123456789...9012345678901234, $2a$05$CCCCCCCCCCCCCCCCCCCCC.)) .toStrictEqual($2a$05$CCCCCCCCCCCCCCCCCCCCC.6.O1dLNbjod2uo0DVcW.jHucKbPDdHS) // tests for $2b$ which fixes wrap-around bugs expect(bcrypt.hashSync(0123456789...9012345678901234, $2b$05$CCCCCCCCCCCCCCCCCCCCC.)) .toStrictEqual($2b$05$CCCCCCCCCCCCCCCCCCCCC.XxrQqgBi/5Sxuq9soXzDtjIZ7w5pMfK) }) test(embedded_nulls, () { expect(bcrypt.hashSync(Passw\0rd123, $2b$05$CCCCCCCCCCCCCCCCCCCCC.)) .toStrictEqual($2b$05$CCCCCCCCCCCCCCCCCCCCC.VHy/kzL4sCcX3Ib3wN5rNGiRt.TpfxS) expect(bcrypt.hashSync(Buffer.from(Passw\0 you can literally write anything after the NUL character), $2b$05$CCCCCCCCCCCCCCCCCCCCC.)) .toStrictEqual($2b$05$CCCCCCCCCCCCCCCCCCCCC.4vJLJQ6nZ/70INTjjSZWQ0iyUek92tu) })注意embedded_nulls用例同时覆盖了Buffer 输入说明 NUL 修复对二进制缓冲区同样生效——这是 bcrypt.js 中data参数支持string | Buffer的直接体现。因此凡是在 v5.0.0 之前注册过密码的系统都建议尽快升级并对存量哈希做重新哈希评估。二、版本演进时间线13 个里程碑一览CHANGELOG 记录了 30 个版本下面按主题梳理出对开发者影响最大的里程碑版本日期核心变更v0.1.2早期安全修复未正确读取 rounds此前恒为 4 roundsv0.2.0早期新增异步功能API 变更hashpw→encrypt弃用 libbsd 改用 OpenSSLv0.4.0早期新增getRounds函数可解析哈希中的 roundsv0.5.0早期从 libeio/ev 升级到 libuv破坏 0.4.x 兼容性v0.8.22015-03始终用回调生成随机字节以避免阻塞v0.8.72016-06nan 2.3.5改进 Node v6 支持v1.0.02016-12新增 Promise 支持v1.0.12016-12修复 promise 的解构导入destructuring importsv1.0.22016-12修复非法参数时compare的 promise rejectionv2.0.02018-04$2b$成为默认 bcrypt 版本v3.0.02018-07放弃 NodeJS 4v4.0.02020-02切换到 N-APINAPIbcrypt放弃 NodeJS 8v5.0.02020-06修复 wrap-around 与 NUL 两个安全缺陷z/OS 实验性支持node-pre-gyp 0.15.0v6.0.02025-02放弃 NodeJS 16node-pre-gyp → prebuildifynode-addon-api 8.3.0JS 代码升级到新 ES 语法三、v2.0.0$2b$成为默认版本哈希格式详解v2.0.02018-04-07将默认 bcrypt 版本从$2a$改为$2b$。这直接体现在 bcrypt.js 的genSaltSync中function genSaltSync(rounds, minor) { // default 10 rounds if (!rounds) { rounds 10; } else if (typeof rounds ! number) { throw new Error(rounds must be a number); } if (!minor) { minor b; } else if (minor ! b minor ! a) { throw new Error(minor must be either a or b); } return bindings.gen_salt_sync(minor, rounds, crypto.randomBytes(16)); }minor参数只接受a或b未指定时默认b。对应地异步 genSalt 也支持genSalt(rounds)、genSalt(rounds, minor, cb)、genSalt(cb)等多种调用形态。哈希的 60 字符结构生成的哈希固定为60 个字符采用$[algorithm]$[cost]$[salt][hash]结构$2b$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa | | | | | | | hash-value K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa | | salt nOUIs5kJ7naTuTFkBy1veu | cost-factor 10 2^10 rounds hash-algorithm identifier 2b BCrypt2 字符哈希算法标识$2a$或$2b$表示 BCryptcost成本因子 n迭代次数为 2^n16 字节128 位saltBase64 编码为 22 字符24 字节192 位哈希值Base64 编码为 31 字符。哈希所用字符集为./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$src/bcrypt.cc 中的Base64Code表。版本兼容性与getRoundsv1.0.x 生成的哈希在 v2.x 及之后100% 兼容一般迁移只需升级package.json但 v2.x 用默认参数生成的哈希在旧版本上无法验证本库同时支持$2a$与$2b$前缀$2x$/$2y$是 John the Ripper 专用实现理论上与$2b$兼容getRounds自 v0.4.0 引入可从既有哈希中解析出 roundsbcrypt.js 将哈希透传给 C 层的bcrypt_get_roundssrc/bcrypt.cc。四、v1.0.0 与 v1.0.xPromise 支持的引入与打磨v1.0.02016-12-04新增 Promise 支持v1.0.1 修复 promise 的解构导入v1.0.2 修复compare在非法参数下 promise 拒绝行为。这些能力集中在 promises.js 中function promise(fn, context, args) { return new Promise((resolve, reject) { args.push((err, data) { if (err) { reject(err); } else { resolve(data); } }); fn.apply(context, args); }); }机制要点所有接受回调的异步方法genSalt、hash、compare当未传回调时自动返回 Promise——bcrypt.js 中的if (!cb) { return promises.promise(genSalt, this, [rounds, minor]); }即为此逻辑。Promise实现取自global.PromiseNode.js 原生 Promise并可用bcrypt.promises.use()替换为任意 Promises/A 实现如 bluebird测试 test/promise.test.js 的change_promise_impl_promise用例验证了这一能力。v1.0.2 修复的非法参数时 compare 的 promise rejection体现在 compare当cb存在但非函数时直接返回一个拒绝的 Promise// cb exists but is not a function // return a rejecting promise if (cb typeof cb ! function) { return promises.reject(new Error(cb must be a function or null to return a Promise)); }三种调用范式Promise 时代的实战写法// 1) 回调风格 bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) { // Store hash in your password DB. }); // 2) Promise 风格 bcrypt.hash(myPlaintextPassword, saltRounds).then(hash { // Store hash in your password DB. }); // 3) async/await 风格推荐 async function checkUser(username, password) { const match await bcrypt.compare(password, user.passwordHash); if (match) { /* login */ } }ESM 环境同样支持import bcrypt from bcrypt后直接await bcrypt.compare(...)。可参考 examples/async_compare.js 中完整的genSalt → hash → compare异步链路示例。五、v3.0.xNAN 依赖迭代与 Node.js 12 兼容v3.0.x 系列的变更几乎全部围绕NANNative Abstractions for Node.js版本迭代版本NAN 版本其他说明v3.0.12.11.0—v3.0.22.11.1—v3.0.32.12.1—v3.0.52.13.1NodeJS 12 兼容从捆绑依赖中移除 node-pre-gypv3.0.62.13.2—v3.0.72.14.0node-pre-gyp 0.13v3.0.8—node-pre-gyp 0.14提供 NodeJS 13 预编译二进制这一阶段本库仍基于 NAN 编写绑定直到 v4.0.0 才彻底切换到 N-API。值得注意的是v3.0.4-napi2019-03-08是首个将 N-API 版本与 NAN 版本功能对齐的中间版本为后续 v4.0.0 的正式切换做了铺垫。六、v4.0.0切换到 N-API 的架构分水岭v4.0.02020-02-17完成了一次根本性的绑定架构迁移从 NAN 切换到N-APINAPI同时放弃 NodeJS 8。当前 src/bcrypt_node.cc 首行#define NAPI_VERSION 3即声明了 N-API 3 版本。关键架构证据原生方法导出src/bcrypt_node.cc通过NODE_API_MODULE(NODE_GYP_MODULE_NAME, init)导出gen_salt_sync、gen_salt、encrypt_sync、encrypt、compare_sync、compare、get_rounds七个原生函数异步工作线程SaltAsyncWorker、EncryptAsyncWorker、CompareAsyncWorker均继承Napi::AsyncWorker将重计算Blowfish 密钥扩展 2^rounds 轮迭代放入线程池不阻塞主事件循环——这正是 README 推荐服务端使用异步 API 的原因Buffer 支持Encrypt/Compare原生函数都通过info[0].IsBuffer() ? BufferToString(...) : AsNapi::String()同时支持字符串与 Buffer 输入盐校验ValidateSaltsrc/bcrypt_node.cc检查$Vers$log2(NumRounds)$saltvalue格式rounds 必须落在 0–31 且1 n BCRYPT_MINROUNDS(16)。N-API 的核心优势是跨 Node.js 大版本稳定C 插件只需编译一次即可在支持该 N-API 版本的多个 Node.js 版本上复用无需针对每个 Node 主版本重新编译。v4.0.12020-02-27修复了 Alpine Linux 下的编译错误正是 N-API 迁移后针对 musl libc 环境的兼容性修补。七、v5.x安全修复落地 测试框架现代化v5.0.0 除了上文详述的两个安全修复外还有两处值得关注z/OS 实验性支持对应 binding.gyp 中OSzos and NODE_VERSION 16条件下的-qascii编译标志与NAPI_DISABLE_CPP_EXCEPTIONS宏定义src/node_blf.h 也为__MVS__提供了类型别名。这意味着 IBM 大型机平台在此版本起可尝试构建使用node-pre-gyp 0.15.0。v5.1.02022-10-06将测试框架从nodeunit替换为jestpackage.json 中jest: ^29.7.0即为当前证据测试脚本为test: jest见 package.json。仓库 Makefile 也同步更新为通过./node_modules/.bin/jest运行test/*.js全套用例。v5.1.1 继续跟进 node-pre-gyp 1.0.11。八、v6.0.0构建体系革命——node-pre-gyp 退场prebuildify 接棒v6.0.02025-02-28是目前仓库的最新版本四项变更对使用者影响深远放弃 NodeJS 16package.json 中engines: { node: 18 }为硬性约束Node 18 起成为唯一受支持基线node-pre-gyp → prebuildify预编译二进制改为随 npm 包一起分发shipped with the package安装时不再需要联网下载二进制避免了 README 中node-pre-gyp ERR! Tried to download(404)这类经典安装失败场景node-addon-api 升级到 8.3.0package.json 依赖为node-addon-api: ^8.3.0与node-gyp-build: ^4.8.4JS 代码升级到新 ES 语法如 bcrypt.js 采用const/let、箭头函数、模板对象简写等现代写法。新构建链路解析package.json 中的脚本定义scripts: { test: jest, install: node-gyp-build, build: prebuildify --napi --tag-libc --strip }npm install时node-gyp-build会优先使用随包分发的预编译二进制prebuilds/目录找不到时才回退到本地编译——这是安装即用、断网可装的机制核心npm run build时prebuildify --napi --tag-libc --strip生成 N-API 预编译产物--tag-libc会区分 glibc 与 muslAlpine运行时--strip剔除调试符号运行时加载入口在 bcrypt.jsconst bindings require(node-gyp-build)(path.resolve(__dirname));。预编译二进制覆盖 Windows x64/arm64、Linux x64/arm64GlibC 与 musl、macOS x64/arm64 平台仅对当前稳定版与受支持的 LTSNode 18积极测试。仓库中的 Dockerfile 演示了标准的多平台构建流程# 构建并导出跨平台预编译产物 docker build -t bcryptjs-builder . CONTAINER$(docker create bcryptjs-builder) docker cp $CONTAINER:/usr/local/opt/bcrypt-js/prebuilds . docker rm $CONTAINER # 交叉构建 ARM示例linux/arm64 docker build -t bcryptjs-builder --platform linux/arm64/v8 .Dockerfile 内通过ARG FROM_IMAGEnode:18-bullseye控制基础镜像支持RUN_TESTS、TEST_TIMEOUT_SECONDS参数后者用于在模拟跨架构环境时放宽 jest 超时见 test/repetitions.test.js 的读取逻辑。九、API 参考当前版本全部入口一览结合 bcrypt.js 的模块导出当前版本的公开 API 如下方法参数返回值/回调genSaltSync(rounds, minor)rounds可选默认 10minor可选a/b默认b29 字符盐字符串genSalt(rounds, minor, cb)同上cb可选省略时返回 Promisecb(err, salt)hashSync(data, salt)data必填string/Buffersalt必填盐字符串或数字 rounds60 字符哈希hash(data, salt, cb)同上cb可选省略时返回 Promisecb(err, encrypted)compareSync(data, encrypted)data必填encrypted必填true/falsecompare(data, encrypted, cb)同上cb可选省略时返回 Promisecb(err, same)getRounds(encrypted)哈希字符串该哈希使用的 rounds 数promises.use(promiseImpl)Promises/A 实现替换全局 Promise 实现rounds 成本与性能参考rounds并非迭代次数本身而是指数实际迭代次数为2^rounds。从 2GHz 单核的参考基准看数据源自 README.mdrounds吞吐量约8~40 hashes/sec9~20 hashes/sec10~10 hashes/sec11~5 hashes/sec122–3 hashes/sec13~1 sec/hash14~1.5 sec/hash15~3 sec/hash25~1 hour/hash312–3 days/hash有效范围被硬限制在 4–31见 src/bcrypt.cc 的bcrypt_gensalt钳制逻辑请求 1 会被钳到 04测试 test/sync.test.js 的verify_salt_min_rounds验证请求 100 会被钳到 31。默认 10 是安全性与性能的均衡点。生产环境务必采用异步 API因为同步哈希是 CPU 密集型操作会阻塞事件循环导致服务器无法响应其他请求。同步 vs 异步的底层差异从 src/bcrypt_node.cc 源码结构可以清楚看到两套执行路径异步路径gen_salt/encrypt/compare通过Napi::AsyncWorker的子类Queue()进入 libuv 线程池执行回调在OnOK()中触发同步路径*_sync直接在当前线程内完成 Blowfish 全部迭代后返回。这也解释了 v0.8.2 的变更始终用回调生成随机字节以避免阻塞即使盐生成这类轻量操作也通过crypto.randomBytes(16, callback)异步完成见 bcrypt.js避免任何不必要的同步阻塞。十、安全建议与升级路径总结综合 CHANGELOG 与 README 的安全说明给出现阶段的实践清单立即升级到 v5.0.0当前推荐 v6.0.0 5.0.0的版本同时受 wrap-around 与 NUL 缺陷影响长密码与含 NUL 密码会严重弱化v6.0.0 进一步要求 Node 18按 Node 版本选择 bcrypt 版本Node 4 用 2.1.0Node 8 用 1.0.3 4.0.0Node 10/11 用 3Node 12 起用 3.0.6Node 18 起用 6.0.0详见 README.md 的版本兼容表node-gyp仅支持稳定版 Node安装不稳定pre 版Node 时会出现gyp ERR! stack Error: pre versions of node cannot be installed错误关注 72 字节截断语义这是 bcrypt 算法固有行为非本库缺陷设计密码长度策略时需考虑 UTF-8 字节数了解时序安全边界bcrypt 哈希比对本身因 preimage resistance 不易受时序攻击但本库的compare函数并非恒定时间实现可能在失配时提前退出请勿将比较逻辑移植到库外使用自行审计作为安全工具使用前应审阅 src/bcrypt.cc 与 src/blowfish.cc后者源自 OpenBSD 的 Blowfish 实现发现任何可疑问题应提交给维护者。延伸阅读使用方式、API 详解与安全说明README.md哈希算法核心实现src/bcrypt.cc、src/blowfish.ccNode 绑定层N-APIsrc/bcrypt_node.cc、src/node_blf.hJS 封装层bcrypt.js、promises.js测试套件test/async.test.js、test/sync.test.js、test/promise.test.js、test/implementation.test.js、test/repetitions.test.js构建配置binding.gyp、package.json、Makefile、Dockerfile可运行示例examples/async_compare.js、examples/forever_gen_salt.js赞分享密码学【免费下载链接】node.bcrypt.jsbcrypt for NodeJs项目地址https://gitcode.com/gh_mirrors/no/node.bcrypt.js点击查看免费下载相关推荐Draft.js 版本演进全解析从 CHANGELOG 看 0.1.0 到 0.11.7 的关键能力与 API 变迁Draft.js 版本演进全解析从 CHANGELOG 看 0.1.0 到 0.11.7 的关键能力与 API 变迁 导读 Draft.js 是 Facebo前端UI组件Mac Mouse Fix 配置指南5 分钟让 Mac 侧键与平滑滚动从零到上手Mac Mouse Fix 配置指南5 分钟让 Mac 侧键与平滑滚动从零到上手 点鼠标侧键没反应滚轮一格一格跳松手还容易冲过头。这不是鼠标坏了是 ma桌面应用系统编程victory-core 技术解析从 CHANGELOG 看 Victory 可视化核心库的架构演进、TypeScript 迁移与关键修复victory core 技术解析从 CHANGELOG 看 Victory 可视化核心库的架构演进、TypeScript 迁移与关键修复 本文以 packa数据可视化UI组件上一篇240亿参数重塑本地AIMagistral Small 1.2开启多模态轻量化革命下一篇30秒免配置的croc文件传输跨网速传搞定创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

eve 多租户内存实战:以认证作用域元组实现租户级记忆隔离

eve 多租户内存实战:以认证作用域元组实现租户级记忆隔离

人工智能AI AgentAgent 框架后端工具调用 【免费下载链接】eve The Open Framework for Building Agents 项目地址: https://gitcode.com/gh_mirrors/eve28/eve 点击查看 免费下载 多租户内存(Multi-tenant Memory)是 eve 中把"谁可以读…

2026/10/14 2:07:19 阅读更多 →
Binaryen 贡献指南深度解读:AI 协作规范与新增指令全流程清单

Binaryen 贡献指南深度解读:AI 协作规范与新增指令全流程清单

编译器编程语言 【免费下载链接】binaryen Optimizer and compiler/toolchain library for WebAssembly 项目地址: https://gitcode.com/gh_mirrors/bi/binaryen 点击查看 免费下载 引言 Binaryen 是 WebAssembly 生态中一款核心的编译工具链库与优化器&#xff0…

2026/10/14 2:07:19 阅读更多 →
高位数阶乘计算:C语言数组模拟、Python内置与MATLAB符号运算对比

高位数阶乘计算:C语言数组模拟、Python内置与MATLAB符号运算对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 2:07:19 阅读更多 →

最新新闻

Vue 3 轻量级数据透视表组件:支持拖拽+聚合+Excel导出

Vue 3 轻量级数据透视表组件:支持拖拽+聚合+Excel导出

简介:这是一份面向Vue.js中高级开发者的数据透视表功能实现组件包,专为需要在Web应用中快速集成交互式聚合分析表格的前端工程师设计。资源提供两个核心Vue组件:支持拖放配置行列的完整数据透视表,以及轻量级仅聚合功能的PivotTab…

2026/10/14 2:45:28 阅读更多 →
CLRS 习题精解:B 树基本操作(B-TREE-INSERT、查找最值与前驱)与复杂度分析

CLRS 习题精解:B 树基本操作(B-TREE-INSERT、查找最值与前驱)与复杂度分析

文档教程教育 【免费下载链接】CLRS 📚 Solutions to Introduction to Algorithms Third Edition 项目地址: https://gitcode.com/gh_mirrors/clr/CLRS 点击查看 免费下载 本文以《算法导论(第三版)》第 18 章 18.2 节"B 树…

2026/10/14 2:45:28 阅读更多 →
加班后的回程路上,更适合先听完《妈妈,我失业了》

加班后的回程路上,更适合先听完《妈妈,我失业了》

傍晚下班路上,中学生,把耳机音量调到刚好盖住走廊声在便利店门口抽一口冷气再进门。歌词里「走不出了」写的就是这种说不清又不甘心的时刻——《妈妈,我失业了》接住的,正是这截情绪。词曲:小熊歌|演唱&…

2026/10/14 2:45:28 阅读更多 →
【Python实战】基于FastAPI的绿植养护管理系统 - 完整项目

【Python实战】基于FastAPI的绿植养护管理系统 - 完整项目

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐➕关注👀是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝关注👀欢迎…

2026/10/14 2:45:28 阅读更多 →
Cap 开源录屏上手:从依赖自检到发出第一条分享链接

Cap 开源录屏上手:从依赖自检到发出第一条分享链接

Cap 开源录屏上手:从依赖自检到发出第一条分享链接 【免费下载链接】Cap Open source Loom alternative. Beautiful, shareable screen recordings. 项目地址: https://gitcode.com/GitHub_Trending/cap1/Cap 给同事讲一个功能,你得先凑齐三人的日…

2026/10/14 2:45:28 阅读更多 →
单片机毕设选题推荐:基于STM32的婴儿摇篮哭泣尿床监测与环境联动控制系统设计 基于物联网的婴儿床温湿度自动调节与哄睡装置设计(032707)

单片机毕设选题推荐:基于STM32的婴儿摇篮哭泣尿床监测与环境联动控制系统设计 基于物联网的婴儿床温湿度自动调节与哄睡装置设计(032707)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/14 2:44:28 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →