草庐IT

c++ - 出于性能原因替代 stdext::hash_map

我正在开发一个高性能应用程序,其中所有调用都必须合理。我有一张map,在每次交易开始时使用一次来进行我想改进的查找。map在启动时加载,之后不会改变。下面映射中的键是一个std::string但如果需要它可以更改为char数组。C或C++作为解决方案很好。typedefstdext::hash_mapsymbols_t;有没有人知道任何其他可以消除查找或更快的解决方案?提前感谢您的帮助。来自编辑的附加信息:1.hash_map目前有35万个元素。2.每个键值的长度通常在4到10个字符之间。3.从第三方API接收回调信息。回调被赋予一个符号,在进行map查找时用作键值。软件的其余部分由m

c++ - Rabin-Karp 算法的最佳哈希函数是什么?

我正在为Rabin-Karp算法寻找高效的哈希函数。这是我的实际代码(C编程语言)。staticboolf2(charconst*consts1,size_tconstn1,charconst*consts2,size_tconstn2){uintmax_thsub=hash(s2,n2);uintmax_ths=hash(s1,n1);size_tnmax=n2-n1;for(size_ti=0;i我考虑了一些Rabin-KarpC实现,但所有代码之间存在差异。所以我的问题是:Rabin-Karp哈希函数应该具备哪些特征? 最佳答案

c++ - 将 DJB 哈希转换为 64 位

如果我使用64位无符号整数,DanBernstein的哈希函数是否仍能正常运行?uint64hash_djb2(registeruchar*str,registersize_tlength){registeruint64hash=5381L;while(length--){hash=((hash 最佳答案 djb哈希函数基于LinearCongruentialGenerator,其形式为x=(a·x+c)modm。通过检查函数,我们意识到a=33,c=input在djb的情况下,但模数有点隐藏,因为它由变量hash的类型,原始形式的

c++ - 计算种子文件的信息哈希

我正在使用C++解析torrent文件的信息散列,与此站点相比,我无法获得“正确”的散列值:http://i-tools.org/torrent我构建了一个非常简单的玩具示例,只是为了确保我掌握了正确的基础知识。我在sublime中打开了一个.torrent文件并删除了除信息字典之外的所有内容,所以我有一个如下所示的文件:d6:lengthi729067520e4:name31:ubuntu-12.04.1-desktop-i386.iso12:piecelengthi524288e6:pieces27820:¡´E¶ˆØËš3í..............(moreunreadabl

c++ - 如何将 13 位值映射到 4 位代码?

我有一些数据包处理程序的std::map。我在分析之前没有注意到,但不幸的是,这个map查找本身就消耗了大约10%的CPU时间(调用的时间太多)。输入数据中通常最多只存在10个键。所以我试图在map前实现一种键缓存。键值为13位整数。我知道只有8192个可能的键和8192个项目的数组可以提供持续的时间查找,但我已经感到羞愧并且不想使用这种天真的方法:(现在,我只是猜测一些散列方法可以非常快速地为13位整数生成4位代码值。有什么好主意吗?提前致谢。更新除了我的耻辱之外,我无法完全控制源代码,而且几乎禁止为此目的创建新数组。项目经理说(运行探查器的人)链表显示出小的性能提升,并建议使用st

以非专用模板作为值的 C++ hash_map

我想要一个std::hash_map将(例如)常规std:string映射到多个不同的特化另一个模板类。这个例子是我想要实现的(虽然它是错误的并且无法编译):templateclassFoo{public:Foo(T_value){this->value=_value;}private:Tvalue;};intmain(){hash_mapvarious_foos;various_foos["foo"]=Foo(17);various_foos["bar"]=Foo(17.4);} 最佳答案 map只能存储单一的值类型,所以不能直接

c++ - 在 C++ 中获取 double 的精确位表示

假设我们有一个双倍数,比方说,x=4.3241;很简单,我想知道,在C++中,如何简单地为数字表示中的每个位检索一个int?我看过其他questions并阅读bitset上的页面,但恐怕我仍然不明白如何检索这些位。所以,例如,我希望输入是x=4.53,如果位表示是10010101,那么我想要8个整数,每个代表每个1或0。 最佳答案 类似于:doubledoubleValue=...whatever...;uint8_t*bytePointer=(uint8_t*)&doubleValue;for(size_tindex=0;inde

c++ - 在一个字符串中搜索另一个字符串的变位词?

我试图从字符串text中找到一个子字符串,它是字符串pattern的变位词。我的问题:可以Rabin-Karpalgorithm为此目的进行调整?还是有更好的算法?我尝试了一种蛮力算法,但在我的案例中不起作用,因为文本和模式每个都可以达到一百万个字符。更新:我听说有一个使用O(1)空间的最坏情况O(n2)算法。有谁知道这个算法是什么?更新2:作为引用,这里是Rabin-Karp算法的伪代码:functionRabinKarp(strings[1..n],stringsub[1..m])hsub:=hash(sub[1..m]);hs:=hash(s[1..m])forifrom1ton

c++ - knuth 乘法哈希

这是Knuth乘法哈希的正确实现吗。inthash(intv){v*=2654435761;returnv>>32;}乘法溢出会影响算法吗?如何提高该方法的性能? 最佳答案 Knuth乘法哈希用于根据整数k计算{0,1,2,...,2^p-1}中的哈希值。假设p在0到32之间,算法是这样的:将alpha计算为最接近2^32(-1+sqrt(5))/2的整数。我们得到alpha=2654435769。计算k*alpha并将结果对2^32求模:k*alpha=n0*2^32+n1其中0保留n1的最高p位:n1=m1*2^(32-p)+m

c++ - 字符串的双向 "Hashing"

我想从字符串生成int并能够生成它。类似于散列函数但双向函数。我想在我的应用程序中使用整数作为ID,但希望能够在记录或调试时将其转换回来。喜欢:intid=IDProvider::getHash("NameOfMyObject");object*a=createObject(id);...if(error){LOG(IDProvider::getOriginalString(a->getId()),"somemessage");}我听说过稍微修改过的CRC32可以快速且100%可逆,但我找不到它,我自己也写不出来。任何提示我应该使用什么?谢谢!编辑我刚刚找到了来源,我从以下位置获得了整