Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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
如何使用现有的哈希整数为哈希表编制索引? 我现在使用Boost C++,我尝试用CRC32实现无序映射(又名哈希表)。据我所知,它将使用字符串作为初始键,对其进行散列,然后应用另一个操作,以便将其放入存储桶的数量中_C++_Boost_Hash_Unordered Map_Crc32 - Fatal编程技术网

如何使用现有的哈希整数为哈希表编制索引? 我现在使用Boost C++,我尝试用CRC32实现无序映射(又名哈希表)。据我所知,它将使用字符串作为初始键,对其进行散列,然后应用另一个操作,以便将其放入存储桶的数量中

如何使用现有的哈希整数为哈希表编制索引? 我现在使用Boost C++,我尝试用CRC32实现无序映射(又名哈希表)。据我所知,它将使用字符串作为初始键,对其进行散列,然后应用另一个操作,以便将其放入存储桶的数量中,c++,boost,hash,unordered-map,crc32,C++,Boost,Hash,Unordered Map,Crc32,尽管在我的情况下,我希望预先散列字符串键(在Boost中使用单独的CRC函数),然后使用该ID对表进行索引。我需要帮助的问题是CRC32散列有2^32个潜在值,我怀疑我是否需要一个包含2^32个元素的表。在这种情况下我该怎么办 谢谢你的帮助 在基于C的语言中使用模运算符--%: int hashtableIndex = hashValue % hashtableSize; 但是注意C++中结果的符号是“实现定义”,如果hash值是否定的,则可以是否定的。因此,在执行%操作之前,可能需要关闭ha

尽管在我的情况下,我希望预先散列字符串键(在Boost中使用单独的CRC函数),然后使用该ID对表进行索引。我需要帮助的问题是CRC32散列有2^32个潜在值,我怀疑我是否需要一个包含2^32个元素的表。在这种情况下我该怎么办

谢谢你的帮助

在基于C的语言中使用模运算符--
%

int hashtableIndex = hashValue % hashtableSize;
<>但是注意C++中结果的符号是“实现定义”,如果hash值是否定的,则可以是否定的。因此,在执行
%
操作之前,可能需要关闭hashValue中的符号位

还要注意的是,如果已知
hashtableSize
是二的幂,则可以简单地屏蔽
hashValue
以获得索引:

int hashtableIndex = hashValue & (hashtableSize - 1);

Boost已经包含了多个无序的映射实现,为什么您要从头开始编写一个呢?这就是为什么容器会再次对其进行散列以适合存储桶空间的原因。你有充分的理由这样做吗?使用散列进行纠错和使用bucketing有两种不同的用途…我只是在调试构建中使用散列表,它应该保留相应的字符串ID作为游戏实体名称。但是在发布版本中,我只需要ID,因为我的游戏引擎应该只使用这些ID。这是我使用一个单独的哈希函数的主要动机。如果
hashtableSize
是无符号类型,那么signGood IDEA就不会有问题。但假设我有7个桶/元素。如果我使用一个模数,那么碰撞概率不会从1/2^32增加到1/7吗?在这种情况下,屏蔽散列值是否更为有利?7个bucket表的冲突概率总是(理想情况下)1/7。屏蔽只是做模的另一种方法——在数学上完全等效(除了符号问题)——但它只适用于二的幂。@anatolyg--。请注意,即使您“缩小”哈希值以选择表槽,您仍然可以将完整的哈希值粘贴到哈希项中,以便进行快速比较。只有当哈希值与搜索哈希值匹配时,才能对“真实”键值进行“长”比较。这使得将“真正的”键值(例如字符串)放在单独的位置非常有效,可能与一些更大的结构“共享”。