【问题标题】:std::hash for __uint128_t__uint128_t 的 std::hash
【发布时间】:2021-06-30 00:32:15
【问题描述】:

我遇到了散列 __uint128_t 的问题。以下是我的代码:

#include <iostream>

int main () {
    __uint128_t var = 1;
    std::cout << std::hash<__uint128_t> () (var) << "\n";
    return 0;
}

我得到的错误是:

test.cpp: In function ‘int main()’:
test.cpp:5:40: error: use of deleted function ‘std::hash<__int128 unsigned>::hash()’
    5 |     size_t h = std::hash<__uint128_t> () (var);
      |                                        ^

如何获取__uint128_t 的哈希值? (可能是一个非常基本的问题,但我已经在这里停留了一段时间)。另外,我想知道错误的含义。提前致谢。

【问题讨论】:

  • 您可以将其分成两个 64 位值和 combine 它们的哈希值。
  • 好的,你知道错误在说什么吗?
  • __uint128_t 不是标准类型,所以不需要std::hash 来支持它。

标签: c++ c++11


【解决方案1】:

查看https://en.cppreference.com/w/cpp/utility/hash 上的文档。你必须自己写。

下面是一些基本 __uint128_t 哈希函数的代码:

namespace std {
template<>
struct hash<__uint128_t> {
    size_t operator()(__uint128_t var) const {
        return std::hash<uint64_t>{}((uint64_t)var ^ (uint64_t)(var >> 64));
    }
};
}

注意未经测试或编译。

【讨论】:

  • 加一。您能否进一步包含引用的 hash_combine 函数而不是简单的异或?
猜你喜欢
  • 2014-01-08
  • 2018-02-03
  • 2012-12-10
  • 2013-05-03
  • 2015-04-06
  • 2020-12-28
  • 2013-12-03
  • 2021-06-07
相关资源
最近更新 更多