You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++使用libtomcrypt生成SHA3等哈希时偶发截断问题求助

问题根因
  • 你遇到的截断问题和libtomcrypt本身无关,是C++ std::string 构造逻辑的问题:
    • 你使用的string(reinterpret_cast<char*>(hashResult)) 构造函数,会把输入的char* 当做以'\0'(即0x00字节)结尾的C风格字符串处理,一旦哈希结果中出现0值字节,就会被判定为字符串结束,后续内容直接被截断,完全符合你定位到的「遇到1字节零就截断」的特征。
  • 额外隐藏问题:你动态申请的hashResult数组没有释放,存在内存泄漏风险。
修复方案

修改hashSHA3_512函数中二进制哈希转字符串的逻辑,手动指定哈希结果的长度,避免依赖终止符判定长度,同时优化内存管理:

#include <vector>
#include <string>
// 保留原有libtomcrypt相关头文件引入

std::string hashSHA3_512(const std::string& input) {
    // 用vector代替动态数组,自动管理内存,避免泄漏
    std::vector<unsigned char> hashResult(sha3_512_desc.hashsize);
    hash_state md;
    sha3_512_init(&md);
    sha3_process(&md, reinterpret_cast<const unsigned char*>(input.c_str()), input.size());
    sha3_done(&md, hashResult.data());
    // 关键修复:使用带长度参数的string构造函数,传入完整的哈希长度
    std::string stringifiedHash(reinterpret_cast<char*>(hashResult.data()), hashResult.size());
    return stringToHex(stringifiedHash);
}
验证说明

修改后所有哈希结果的64字节都会被完整传入转十六进制函数,不会因为中间出现0值字节被截断,所有SHA系列算法的场景都可以复用该修复逻辑。

内容的提问来源于stack exchange,提问作者Emilio Gennaro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:30:00