尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

F´ 框架 Utils::Hash 哈希工具详解:通用接口、SHA256/CRC32 实现与自定义算法接入指南

F´ 框架 Utils::Hash 哈希工具详解:通用接口、SHA256/CRC32 实现与自定义算法接入指南 嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fpri/fprime点击查看免费下载Utils::Hash是 F´F Prime飞行软件与嵌入式系统框架中面向数据哈希的通用工具模块它通过一个统一接口屏蔽了底层哈希算法的差异既可直接用于一次性/增量式摘要计算也允许开发者按需替换或新增算法实现。本文以 Utils/Hash/README.md 为主线结合仓库内 SHA256、CRC32 两个现成实现与 F´ 帧协议中的真实调用代码完整讲解接口语义、配置方法与自定义实现步骤读完即可在 F´ 工程中直接选用或扩展哈希能力。模块概览与仓库结构Utils/Hash的核心设计思想是接口与实现分离调用方只依赖一份通用接口具体算法从 8 位校验和到 256 位 SHA256 摘要通过编译期配置切换无需改动业务代码。该目录包含以下关键文件Utils/Hash/Hash.hpp通用哈希接口类Utils::Hash的声明是调用方唯一需要熟悉的核心头文件Utils/Hash/HashBuffer.hpp通用哈希缓冲区类Utils::HashBuffer用于存放计算得到的摘要digestUtils/Hash/HashCommon.cpp 与 Utils/Hash/HashBufferCommon.cpp两类中与具体算法无关的公共代码Utils/Hash/HashConfig.hpp实现选择入口通过 include 不同的实现头文件来切换算法openssl/与libcrc/两个子目录分别存放基于 OpenSSL 的 SHA256 实现与零外部依赖的 CRC32 实现。从 Utils/Hash/CMakeLists.txt 可以看到该模块默认编译libcrc/CRC32.cpp、libcrc/lib_crc.c、HashBufferCommon.cpp和HashCommon.cpp并以Fw/Types作为模块依赖这意味着CRC32 是仓库当前的默认哈希实现而openssl/SHA256.cpp并未默认编译需要在使用前手动调整配置与构建。通用哈希接口四个核心方法Utils::Hash接口除构造/析构外只提供 4 个核心方法Hash.hpp 中还额外声明了setHashValue、文件扩展名相关等辅助接口。原文档对每个方法给出了精确定义这里逐一说明其语义与使用场景。hash.init()—— 重置哈希状态init()初始化哈希对象为计算一个新的摘要做好准备。它必须在每次开始计算新哈希前调用会清除上一次计算遗留的全部中间状态。从 SHA256.cpp 的实现可见它内部等价于调用 OpenSSL 的SHA256_Init(hash_handle)并断言返回值为 1CRC32 实现则将句柄复位为初始值0xffffffffLCRC32.cpp。构造函数Hash::Hash()也会自动调用init()因此新构造的对象天然处于可计算的初始状态。hash.update(data, len)—— 增量喂入数据update(data, len)将一段新数据并入当前的哈希状态。它可以被反复调用任意多次从而支持读一段、算一段的分段哈希模式——无论是从缓冲区还是文件中分批读取数据都可以边读边更新。源码中该方法接受const void* data与NATIVE_INT_TYPE len两个参数SHA256 实现逐次调用SHA256_UpdateCRC32 实现则逐字节调用update_crc_32(hash_handle, c)累加 CRC 状态update_crc_32的原型声明在 lib_crc.h是 Lammert Bies 的 ANSI C 库lib_crc提供的标准 CRC32 字节更新函数。hash.final(buffer)—— 输出最终摘要final(buffer)结束当前增量计算返回自最近一次init()以来所有update()数据共同构成的哈希结果写入作为参数的HashBuffer对象。计算完成后对象状态即告失效若需再次计算必须重新调用init()。hash.hash(data, len, buffer)—— 一步到位的一次性哈希hash(data, len, buffer)是init、update、final三者的合并封装当数据已完整收集在一个缓冲区data长度len中时可直接用这个静态方法一次算完。源码实现中SHA256 直接调用 OpenSSL 的单次接口SHA256(data, len, out)并断言返回值非空SHA256.cppCRC32 则在本地变量上循环调用update_crc_32后序列化结果。HashBuffer存放摘要的容器所有final/hash的结果都落在一个Utils::HashBuffer对象中。该类的关键设计见 HashBuffer.hpp 与 HashBufferCommon.cpp包括内部缓冲区大小固定为HASH_DIGEST_LENGTH字节由所选实现的宏决定SHA256 为 32 字节CRC32 为 4 字节派生自Fw::SerializeBufferBase因此摘要可以像普通可序列化数据一样被序列化/反序列化、拷贝或比较提供getBuffAddr()获取摘要字节指针、getBuffCapacity()获取缓冲区容量并通过重载operator/operator!支持摘要的直接比较按长度与逐字节memcmp判定。配置哈希实现从 CRC32 切换到 SHA256算法选择完全由 Utils/Hash/HashConfig.hpp 决定文件中只需 include 目标实现的头文件即可。当前仓库默认配置为#ifndef UTILS_HASH_CONFIG_HPP #define UTILS_HASH_CONFIG_HPP //! Choose the hash implementation that you want to use //! by including the implementation hash header that //! you are interested in. Ie. This could look like: //! //! #include Utils/Hash/openssl/SHA256.hpp //! #include Utils/Hash/libcrc/CRC32.hpp #endif若要将哈希实现切换为 SHA256按原文档示例把 include 换成openssl实现即可#ifndef UTILS_HASH_CONFIG_HPP #define UTILS_HASH_CONFIG_HPP #include Utils/Hash/openssl/SHA256.hpp #endif需要注意两点实践前提构建层面切换后应确保openssl/SHA256.cpp被纳入编译。默认 CMakeLists.txt 只编译 CRC32 相关源文件因此需要相应调整模块源文件列表同时工程必须能够链接 OpenSSL 的 SHA 接口。平台差异仓库在 openssl/README 中说明Utils/Hash/openssl/sha.h被随附在仓库内是因为 macOS 版本不再使用 OpenSSL 的 SHA 实现而会产生弃用告警Linux 上仍使用 OpenSSL 的版本——引入该实现时需结合目标平台确认链接方式。两个现成实现对比OpenSSL SHA256密码学强度openssl/子目录提供基于 OpenSSL 的 SHA256 实现其配置头 SHA256.hpp 定义了三个必需的宏宏值含义HASH_HANDLE_TYPESHA256_CTX哈希内部计算所用的句柄类型OpenSSL 上下文结构体HASH_DIGEST_LENGTHSHA256_DIGEST_LENGTH32 字节摘要长度字节HASH_EXTENSION_STRING.SHA256摘要落盘文件时追加的扩展名libcrc CRC32零外部依赖libcrc/子目录提供 32 位 CRC32 实现不依赖任何外部库仅使用lib_crc.c中自带的update_crc_32逐字节例程。其配置头 CRC32.hpp 定义为宏值含义HASH_HANDLE_TYPEU32用一个 32 位无符号整数作为滚动状态HASH_DIGEST_LENGTH4摘要长度字节HASH_EXTENSION_STRING.CRC32落盘扩展名值得注意的是 CRC32 实现的两个细节init()将句柄初始化为0xffffffffL而final()返回的是状态值的一的补码~(hash_handle)见 CRC32.cpp这与标准 CRC32 算法的收尾约定一致该实现还额外提供了final(U32)重载可把摘要直接以U32形式取出CRC32.cpp。此外libcrc库本身还包含 CRC-16、CRC-CCITT、CRC-DNP、Kermit、Modbus 等算法见 lib_crc.h但本模块仅接入并暴露了 CRC32 一种。自定义哈希实现的接入规范原文档给出了构建自定义实现的完整清单任何新算法只需提供一个头文件声明三个必需宏与一个实现文件即可无缝接入Utils::Hash通用接口。结合现有实现可归纳为以下三个文件1.YourImplementationHash.hpp—— 声明三个必需宏头文件必须定义以下宏Hash/HashBuffer类的编译与 HashCommon.cpp 均依赖它们HASH_HANDLE_TYPE哈希内部计算句柄类型如 SHA256 的SHA256_CTX、CRC32 的U32HASH_DIGEST_LENGTH摘要长度字节直接决定HashBuffer::m_bufferData数组尺寸HASH_EXTENSION_STRING摘要若存入文件时追加的扩展名如.SHA256。参考 SHA256.hpp 的写法推荐用#ifndef保护宏定义便于其他模块覆盖默认值。2.YourImplementationHash.cpp—— 实现接口方法实现文件只需实现 Hash.hpp 中声明的方法除已由HashCommon.cpp提供的文件扩展名三个函数外。需要覆盖的典型方法包括构造函数通常调用init()、hash一次性接口、init、update、final(HashBuffer)若算法句柄恰好是定长整数类型还可像 CRC32 那样补充final(U32)与setHashValue(HashBuffer)后者用于把外部摘要反解回内部状态见 CRC32.cpp。各方法内部应完成算法自身的初始化、字节更新与收尾并对底层 API 返回值使用FW_ASSERT做失败断言如 SHA256 实现的写法。3.README.md—— 实现说明文档按原文档建议为后续维护者附一份说明文档讲清该实现的工作原理与适用场景可参考 libcrc/README 的简短风格。完成后在 HashConfig.hpp 中 include 新头文件并把实现源文件加入 Utils/Hash/CMakeLists.txt 的SOURCE_FILES即可切换生效。框架内的真实应用F´ 帧协议完整性校验Utils::Hash并非孤立工具它已被 F´ 自身的通信协议直接使用。在 Svc/FramingProtocol/FprimeProtocol.cpp 中组帧frame数据载荷序列化完成后调用一次性接口Utils::Hash::hash(buffer.getData(), total - HASH_DIGEST_LENGTH, hash)计算整帧载荷的摘要再将其HASH_DIGEST_LENGTH字节追加到帧尾FprimeProtocol.cpp解帧校验validate接收端用增量接口逐字节重建摘要——先hash.init()再对帧载荷逐字节hash.update(byte, 1)最后hash.final(hashBuffer)并逐字节比对hashBuffer.getBuffAddr()与帧尾携带的摘要不一致即判定校验失败FprimeProtocol.cpp。这段代码恰好完整示范了三种调用形态一次性hash()适合整块数据init/update/final三段式适合流式或逐字节处理HashBuffer::getBuffAddr()则用于取出原始字节参与比较。可见哈希接口的 CRC32默认与 SHA256可选实现直接支撑着 F´ 数据帧的完整性保护。小结Utils::Hash以小而通用的接口设计让 F´ 工程可以在不侵入业务代码的前提下自由切换 SHA256、CRC32 或任意自研算法。使用时记住三条要点init/update/final三段式支持增量哈希、hash()支持一次性哈希、HashConfig.hpp加三个宏即可扩展新实现。若需在帧协议等既有链路中使用务必同步调整 Utils/Hash/CMakeLists.txt 的源文件列表确保所选实现的编译与链接一致。赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fpri/fprime点击查看免费下载相关推荐F´ 通用哈希接口 Utils::Hash从接口设计到 CRC32 实现与自定义算法接入F´ 通用哈希接口 Utils::Hash从接口设计到 CRC32 实现与自定义算法接入 F´F Prime是 NASA 喷气推进实验室开源的一款飞行软件嵌入式系统编程F´ 框架 Utils::Hash 哈希工具深入解析通用接口、可插拔实现与文件校验实战F´ 框架 Utils::Hash 哈希工具深入解析通用接口、可插拔实现与文件校验实战 导读 Utils::Hash 是 F´F Prime飞行软件与嵌入嵌入式系统编程YARA Hash 模块实战指南用 MD5/SHA1/SHA256 与 CRC32 为文件分区创建哈希签名YARA Hash 模块实战指南用 MD5/SHA1/SHA256 与 CRC32 为文件分区创建哈希签名 Hash 模块Hash module自 YAR网络安全模式匹配上一篇QMCDecode三步解开QQ音乐加密文件让qmcflac变回flac下一篇IDM激活脚本使用教程免费冻结试用期3分钟激活完整功能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表