Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的64位哈希表+;_C++_C++11_Hash_Stl_Hashtable - Fatal编程技术网

C++ c+中的64位哈希表+;

C++ c+中的64位哈希表+;,c++,c++11,hash,stl,hashtable,C++,C++11,Hash,Stl,Hashtable,我需要一个使用64位作为哈希的哈希表 更清楚地说,unordered\u set接收一个模板参数Hash,它是一个函子,接受类型为Key的参数并返回一个32位无符号整数 我需要类似的东西,只是它应该接受一个模板参数Hash,这是一个函子,它接受Key类型的参数并返回一个64位无符号整数 有人知道这样一个容器吗(最好是在STL这样的只包含标题的库上) 这里是一个流行的字符串哈希函数 size_t hash( const char * string ) { size_t result = 0

我需要一个使用64位作为哈希的哈希表

更清楚地说,
unordered\u set
接收一个模板参数
Hash
,它是一个函子,接受类型为
Key
的参数并返回一个32位无符号整数

我需要类似的东西,只是它应该接受一个模板参数
Hash
,这是一个函子,它接受
Key
类型的参数并返回一个64位无符号整数


有人知道这样一个容器吗(最好是在STL这样的只包含标题的库上)

这里是一个流行的字符串哈希函数

size_t hash( const char * string )
{
    size_t result = 0;
    while( *string != 0 ) {
        result = result * 31 + *string++;
    }
    return result;
}
编写新的散列函数对于计算机人员来说是一个流行的过去,所以我并不是说这是最好的。
但关键是结果类型不需要更大才能处理更大的字符串。

为什么?对于大多数类型的哈希表,包括允许作为
无序集
实现的哈希表(IIRC,它规定了存储桶),超过表大小四舍五入到二次方的任何位都将丢失。因此,你需要超过40亿个密钥才能使额外的位发挥作用。除非你描述了为什么需要64位哈希结果,以及为什么你觉得32位不够,否则很难提出任何替代方案。无论如何,返回一个
size\u t
,如果使用64位编译器编译,它应该是64位的。实际上,这是不正确的,size\u t不是64位的,我是使用64位编译器编译的。试试sizeof(size_t),你会看到的。int64\t是。。。无论如何,通过使用哈希结果可以有效地解决许多问题。例如:找到一种算法来统一口述记录中使用相同字母的所有单词,一种解决方案是将它们插入哈希表中,通过为单词中的每个字母设置一个位来完成哈希。你可能会说,在这个例子中只有26位是必要的,但是如果我考虑大写字母不同于小写字母的话呢?@ BUC30,哈希值的大小取决于哈希表中的条目数量,而不是散列数据的长度。如果你对一本小说中的每一个句子都进行哈希运算,那么一个32位的键就足够了,因为在任何一本合理的小说中,40亿个句子都要少得多。@buc030
size\u t
在编译64位二进制文件时通常是64位的;例如,见。如果您使用的是64位操作系统,请确保编译器也在构建64位二进制文件。