为 PR #11393 补充缺陷跟踪与合入背景。
源码审查发现以下三份主机侧哈希实现存在尾部处理问题:
触发条件:输入长度 len = 4n + r,其中 n >= 1,r 为 1、2 或 3。处理完整的 4 字节块后,key/ky 已向后推进,但旧代码仍从原始 src 读取尾部,导致实际尾部字节未参与哈希。CommonHash 还会把上一完整块保留在 tmp_ky 中,再左移并拼入尾部。
最小例子:字节序列 01 02 03 04 05 与 01 02 03 04 06,在相同 seed 和 len=5 下,旧版三份实现都得到相同哈希。
业务关联:这些函数用于主机侧 Tiling 缓存键或运行时知识库索引。常规缓存/知识库查询还会比较完整输入,但同一哈希只保留一个条目的路径会出现竞争、覆盖或无法命中。实际受影响范围取决于调用方传入的 key 长度;本 Issue 以函数级复现确认缺陷,未据此推断特定算子已发生错算。合入目的是恢复尾部参与哈希的语义,并用仓库内 UT 防止回归。
const std::array<uint32_t, 2> a = {0x04030201U, 0x00000005U}; const std::array<uint32_t, 2> b = {0x04030201U, 0x00000006U}; // 对以下每个函数分别调用 hash(a.data(), 5U, 271828U) // 和 hash(b.data(), 5U, 271828U),比较输出: // Ops::NN::HostTiling::MurmurHash // Ops::NN::MurmurHash // RuntimeKb::CommonHash
2026-10-20 对真实源码重新编译运行的输出(A/B 为上述两组 5 字节输入):
BEFORE c54aa50 HostTiling::MurmurHash len=5 seed=271828 A=0xf7b27165 B=0xf7b27165 equal=true NN::MurmurHash len=5 seed=271828 A=0xf7b27165 B=0xf7b27165 equal=true RuntimeKb::CommonHash len=5 seed=271828 A=0x39015787 B=0x39015787 equal=true AFTER e218d160 HostTiling::MurmurHash len=5 seed=271828 A=0x409d4bb7 B=0xcaf46109 equal=false NN::MurmurHash len=5 seed=271828 A=0x409d4bb7 B=0xcaf46109 equal=false RuntimeKb::CommonHash len=5 seed=271828 A=0x347f5bfd B=0x347f5bfc equal=false Compatibility: lengths 0,1,2,3,4,8 unchanged for all three implementations.
本次独立复现进程退出码为 0,ASan/UBSan 未报告错误。PR 页面当前显示全部 40 项流水线检查通过。完整 SDK 验证以 PR CI 记录为准。
关联修复 PR:https://gitcode.com/cann/ops-nn/merge_requests/11393
修复范围:三处哈希尾部处理、三份回归测试及其 CMake 接入。当前代码头为 e218d160,PR 已启用 Squash 合并。
此 Issue 根据评审意见补充背景、触发条件、源码级影响和实测结果;材料由 Codex 辅助整理。
Describe the current behavior / 问题描述 (Mandatory / 必填)
为 PR #11393 补充缺陷跟踪与合入背景。
源码审查发现以下三份主机侧哈希实现存在尾部处理问题:
触发条件:输入长度 len = 4n + r,其中 n >= 1,r 为 1、2 或 3。处理完整的 4 字节块后,key/ky 已向后推进,但旧代码仍从原始 src 读取尾部,导致实际尾部字节未参与哈希。CommonHash 还会把上一完整块保留在 tmp_ky 中,再左移并拼入尾部。
最小例子:字节序列 01 02 03 04 05 与 01 02 03 04 06,在相同 seed 和 len=5 下,旧版三份实现都得到相同哈希。
业务关联:这些函数用于主机侧 Tiling 缓存键或运行时知识库索引。常规缓存/知识库查询还会比较完整输入,但同一哈希只保留一个条目的路径会出现竞争、覆盖或无法命中。实际受影响范围取决于调用方传入的 key 长度;本 Issue 以函数级复现确认缺陷,未据此推断特定算子已发生错算。合入目的是恢复尾部参与哈希的语义,并用仓库内 UT 防止回归。
Environment Information / 环境信息 (Mandatory / 必填)
Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
const std::array<uint32_t, 2> a = {0x04030201U, 0x00000005U}; const std::array<uint32_t, 2> b = {0x04030201U, 0x00000006U}; // 对以下每个函数分别调用 hash(a.data(), 5U, 271828U) // 和 hash(b.data(), 5U, 271828U),比较输出: // Ops::NN::HostTiling::MurmurHash // Ops::NN::MurmurHash // RuntimeKb::CommonHashDescribe the expected behavior / 预期结果 (Mandatory / 必填)
Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
2026-10-20 对真实源码重新编译运行的输出(A/B 为上述两组 5 字节输入):
本次独立复现进程退出码为 0,ASan/UBSan 未报告错误。PR 页面当前显示全部 40 项流水线检查通过。完整 SDK 验证以 PR CI 记录为准。
Special notes for this issue/备注 (Optional / 选填)
关联修复 PR:https://gitcode.com/cann/ops-nn/merge_requests/11393
修复范围:三处哈希尾部处理、三份回归测试及其 CMake 接入。当前代码头为 e218d160,PR 已启用 Squash 合并。
此 Issue 根据评审意见补充背景、触发条件、源码级影响和实测结果;材料由 Codex 辅助整理。