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

开放寻址哈希表robin_hood插入数据损坏问题求助

哈希表替换后数据损坏排查求助

我尝试将std::unordered_map<uint64_t, edge_type>(其中edge_type是包含两个uint32_t成员的结构体)替换为robin_hood::unordered_flat_map<uint64_t, edge_type>,但代码出现自旋锁问题。起初猜测是迭代器失效导致,换成robin_hood::unordered_node_map后结果正确,但性能反而比std::unordered_map更差,似乎验证了迭代器失效的假设。

随后追踪代码发现插入的数据出现损坏,核心代码片段如下:

robin_hood::unordered_flat_map<uint64_t, edge_type> edges_;

void add_edge(uint32_t x, uint32_t y, uint32_t z, uint32_t f) {
    const uint64_t e = detail::make_edge(x, y);
    // ... 其他逻辑
    std::cout << "e: " << e << " (" << f << ", " << z << ")" << std::endl;

    edges_.emplace(e, edge_type(f, z));
    edge_type edg = edges_.at(e);
    std::cout << edg.face_ << " " << edg.vertex_ << std::endl;
    ZI_ASSERT(edges_.at(e) == edge_type(f, z));
}

断言语句执行失败,添加打印日志后发现:最后一次插入的键对应的值本应为(2,2),但取出的值却是(1,2),日志输出如下:

e: 18446744073709551614 (1, 2)
new node
1 2
e: 18446744069414584317 (1, 0)
new node
1 0
e: 18446744065119617023 (1, 1)
new node
1 1
e: 18446744073709551613 (2, 3)
new node
2 3
e: 18446744065119617020 (2, 0)
new node
2 0
e: 18446744060824649727 (2, 2)
overwrite_node
1 2
Assertion failed: (edges_.at(e) == edge_type(f,z)), function add_edge, file tri_mesh.hpp, line 175.

我换用另外两种扁平哈希表实现时,仍遇到相同的数据损坏问题,请问可能是什么原因导致的?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:03:31