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

时间:2016-02-20 21:17:03

标签: c++ hash portability c++-standard-library string-hashing

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 ++一起使用的方式)?

2 个答案:

答案 0 :(得分:4)

即可。您无法以便携方式访问编译器的内部实现细节。怎么可能有用?

在完全由同一编译器供应商进行下一次编译器更新之后,您甚至无法确定实现是否仍然存在。或者更糟糕的是,它仍然可以正常编译但具有不同的运行时行为。这是一个可维护性的噩梦和无休止的调试会议等待发生。

如果将来需要可移植性或向后兼容性,请实现自己的哈希函数并模仿if( Input.touches.Length > 0 ) { if ( Input.touches[0].phase == TouchPhase.Began ) { 的行为。

答案 1 :(得分:0)

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

  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!
  5. 归功于instructing me about this wrapping trick last year的@hvd。