当使用boost库时,函数boost::hash_combine的工作方式如下:seed^=hash_value(v)+0x9e3779b9+(seed>2);http://www.boost.org/doc/libs/1_46_1/doc/html/hash/reference.html#boost.hash_combine与简单的异或运算相比,这种方法有什么优势?通过XOR-ing,甚至可以使用散列函数将无序容器用作键,而这个容器是顺序相关的。 最佳答案 有很多有序的容器,比如列表。如果您要使用XOR,那么您基本上会说[0,1]
我正在尝试使用googledense_hash_map来存储键值数据而不是std:map。当我使用(int,int)对进行测试时,我设置了set_empty_key(mymap,-2)并且它起作用了。但是,现在当我将它与我的(hash,value)对一起使用时,我设置了set_empty_key(mymap-2)或set_empty_key(mymap,some_random_hash),在这两种情况下我的程序都会在set_empty_key();中崩溃。有人可以指导我吗?我该如何修复此崩溃?谢谢。 最佳答案 我不知道您遇到的崩溃的
假设我们有一组元素并希望将它们存储在HashMap中(例如std::unordered_set),并且每个元素都有一个uint64_t类型的键其值可以从0到其最大可能值变化,使用普通散列函数是否是最佳选择,其中键的散列值是键本身?它是否取决于使用的容器(即Google的稀疏哈希与来自STL的std::unordered_map)?键值出现的概率未知。 最佳答案 如果您需要散列的只是具有未知概率的任何可能值的uint64_t,并且您的输出必须是uint64_t,那么您不会通过更改该值获得任何优势。只需使用key本身。如果您对值的分布有
我想在编译时根据派生类型为类生成哈希。今天我生成它如下:templateclassTypeBase{public:staticconstunsigneds_kID;};templateconstunsignedTypeBase::s_kID=hash(typeid(Type));但这会生成(非常不必要的)运行时初始化代码(hash(..)函数基于std::type_info::name()进行简单的散列)想法? 最佳答案 考虑到进程启动时发生的所有其他事情,以及您现有代码的简单和优雅,假设您不对大量类型进行哈希处理,我将保留您现有的
Boost库提供了一个方便的函数hash_value,它基本上只是调用了:returnhash()(key);据我所知,C++11包含与boost::hash非常相似的std::hash,但不包含std::hash_value。这需要应用程序代码创建一个hash对象并调用它的operator()而不是仅仅调用一个方便的函数。std::hash_value未标准化是否有某种原因? 最佳答案 std::hash函数的主要用途是用于从std::unordered_*容器组中的键获取哈希值的对象。这些将始终包含并使用相应的对象,可能会使用空
在继续之前我想提一下,我已经查看了在本网站和其他网站上提出相同问题的其他问题。我希望我能得到一个好的答案,因为我的目标有两个:首先,我想学习如何创建哈希表。其次,我发现StackOverflow上的很多答案都倾向于假定对通常不存在的主题有一定程度的知识,尤其是对于较新的类型。话虽这么说,但我希望编辑我的主要信息,以便在我自己弄明白之后更深入地解释该过程。进入主菜:据我目前的理解,哈希表是一个列表数组(或类似的数据结构),希望以最佳方式尽可能少地发生冲突,以保持O(1)的复杂度。以下是我目前的流程:所以我的第一步是创建一个指针数组:Elem**table;table=newElem*[s
根据标准,std::hash中不支持容器(更不用说无序容器了)类(class)。所以我想知道如何实现它。我拥有的是:std::unordered_map_properties;std::wstring_class;我考虑过迭代条目,计算键和值的各个散列(通过std::hash)并以某种方式连接结果。执行此操作的好方法是什么?如果未定义map中的顺序,这有什么关系吗?注意:我不想使用boost。有人建议一个简单的异或,所以它会是这样的:size_tMyClass::GetHashCode(){std::hashstringHash;size_tmapHash=0;for(autoprop
我想为基类和所有派生类部分特化我无法更改的现有模板(std::tr1::hash)。原因是我正在为多态性使用奇怪的重复模板模式,并且散列函数是在CRTP基类中实现的。如果我只想部分专门化CRTP基类,那么很简单,我可以这样写:namespacestd{namespacetr1{templatestructhash>{size_toperator()(constCRTPBase&base)const{returnbase.hash();}};}}但是这个特化不匹配实际的派生类,只匹配CRTPBase.我想要的是一种为Derived编写部分特化的方法当且仅当它源自CRTPBase.我的伪代
在C++中从两个(或更多)短整数生成唯一ID的最佳方法是什么?我正在尝试唯一标识图中的顶点。顶点包含两到四个短整数作为数据,理想情况下ID是它们的某种哈希。比起速度或易用性,更喜欢便携性和独特性。这里有很多很好的答案,今晚我将尝试所有这些答案,看看最适合我的问题。关于我正在做的事情再多说几句。该图是音频文件样本的集合。我将该图用作马尔可夫链,以从旧文件生成新的音频文件。由于每个顶点存储一些样本并指向另一个样本,并且样本都是短整数,因此从数据生成ID似乎很自然。将它们组合成一个longlong听起来不错,但也许像0123generateID这样简单的东西就是我所需要的。不确定需要多少空间
我开始使用unordered_set来自tr1的类(class)命名空间以boost对普通(基于树的)STL的访问map.但是,我想在boost(boost::thread::id)中存储对线程ID的引用,并意识到这些标识符的API非常不透明,您无法清楚地获得它的哈希值。令人惊讶的是,boost实现了tr1的部分内容(包括hash和unordered_set),但它没有定义能够散列线程ID的散列类。查看boost::thread::id的文档我发现线程ID可以输出到流中,所以我的散列解决方案是这样的:structboost_thread_id_hash{size_toperator()