【问题标题】:64 bit hash table in c++c++中的64位哈希表
【发布时间】: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


【解决方案1】:

这是一个流行的字符串散列函数

size_t hash( const char * string )
{
    size_t result = 0;
    while( *string != 0 ) {
        result = result * 31 + *string++;
    }
    return result;
}

编造新的散列函数是计算机人过去很流行的事情,所以我并不是说这是最好的。 但关键是结果类型不需要更大来处理更大的字符串。

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 2013-03-05
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多