我可以(可移植)访问C++标准库的哈希实现吗?

Can I get (portable) access to the C++ standard library's hash implementation?

本文关键字:哈希 实现 标准 可移植 访问 C++ 我可以      更新时间:2023-10-16

GNU C++标准库有:

  struct _Hash_impl
  {
    static size_t
    hash(const void* __ptr, size_t __clength,
     size_t __seed = static_cast<size_t>(0xc70f6907UL))
    { return _Hash_bytes(__ptr, __clength, __seed); }
    /* etc. */
  }

作为其实现的一部分(例如,这就是它在字符串上使用的内容)。现在,我也想使用该代码...我如何以可移植的方式访问它(例如,以与 Clang 的 libc++ 一起使用的方式)?

No.您无法以可移植的方式访问编译器的内部实现详细信息。这怎么可能呢?

您甚至无法确定在同一编译器供应商的下一次编译器更新后,实现是否仍然存在。或者更糟糕的是,它可能仍然可以很好地编译,但具有不同的运行时行为。这是一场可维护性的噩梦,也是等待发生的无休止的调试会话。

如果您将来需要可移植性或向后兼容性,请实现自己的哈希函数并模仿_Hash_impl的行为。

我一直

在想,也许我可以在不实际这样做的情况下获得无聊的实现效果。我还没有实现这个,但我相信它应该可以工作:

  1. 编写不允许重新分配的自定义分配器my_allocator
  2. 我们现在可以使用类std::vector<char, my_allocator>,它用各种std::vector包装原始缓冲区。
  3. 给定void* buf和大小(以字节为单位n),我们实例化一个包装向量:std::vector<int, my_allocator<int>> vec(n, {}, buf);
  4. 现在std::hash(vec) FTW!

感谢@hvd去年指导我这个包装技巧。