【发布时间】:2013-08-15 23:08:09
【问题描述】:
我需要一个使用 64 位作为哈希的哈希表。
为了更清楚,unordered_set 接收一个模板参数 Hash,它是一个函子,它接受一个类型为 Key 的参数并返回一个 32 位无符号整数。
我需要类似的东西,只是它应该接受一个模板参数Hash,它是一个接受Key 类型参数并返回一个64 位无符号整数的函子。
有谁知道这样的容器(最好在像 STL 这样的仅标头库上)?
【问题讨论】:
-
为什么?对于大多数类型的哈希表,包括允许作为
unordered_set实现的哈希表(IIRC 并且它规定了桶),超出表大小的任何位都将丢失,四舍五入到 2 的幂。因此,您需要超过 40 亿个密钥才能使额外的位重要。 -
除非您描述了为什么需要 64 位哈希结果,以及为什么您觉得 32 位不够用,否则很难提出任何替代方案。不管怎样,
std::hash::operator()返回一个size_t,如果你使用 64 位编译器编译,它应该是 64 位的。 -
其实这是不正确的,size_t不是64位的,我是用64位的编译器编译的。试试 sizeof(size_t) 你会看到的。 int64_t 是...无论如何,许多问题都可以通过使用哈希结果有效地解决。例如:找到一种算法来联合字典中使用相同字母的所有单词,一种解决方案是将它们插入到哈希表中,通过为单词中存在的每个字母设置一个位来完成哈希。你可能会说在这个例子中只需要 26 位,但是如果我认为大写字母与小写字母不同呢?
-
@buc030 哈希值的大小取决于哈希表中的条目数,而不是哈希数据的长度。如果您要对小说中的每个句子进行散列处理,那么 32 位密钥就足够了,因为任何一部合理的小说中的句子都少于 40 亿个。
-
@buc030
size_t在编译 64 位二进制文件时通常为 64 位;例如,参见this。如果您使用的是 64 位操作系统,请确保您的编译器也在构建 64 位二进制文件。
标签: c++ c++11 hash stl hashtable