一种能高速查找的自适应哈希表
最近在做行情接收和处理相关的工作,其中一个关键步骤是根据行情数据的issue code栏位判断该数据是否是我们需要的,如果不需要则直接丢弃。issue code是一个定长字元串,这就涉及到了查找字元串的问题,一般来说直接用一个通用的哈希表就好了,比如std::unordered_map
。不过从实际数据中我发现issue code栏位存在一些pattern:有些位置的字元是固定不变的,有些会在小范围内变动,有些会在较大范围内变动,于是我想如果只根据少数几个variance较大位置的字元算hash值能否更快呢?也就是使得哈希表能根据表中现有的key自动调整hash演算法,做到既能快速算出hash值,又让这些值能较为均匀的分布在表中,以达到快速查找的目的。
最终我把想法实现了出来,发现效果还不错,并放到了github上:https://github.com/MengRao/str。这个项目里有两个头文件:Str.h
和StrHash.h
,前者是一个char数组的简单封装,提供了高效的字元串比较函数;后者就是这个自适应哈希表的实现:StrHash
。
实际上StrHash
是std::map
的子类,所以用户可以直接使用std::map
的介面对哈希表进行增删改,但在查表前需要调用一次doneModify
函数以生成合适的hash参数,接下来就可以通过fastFind
函数进行高速查找了。
Benchmark显示StrHash
的查找方法比std::unordered_map
快7倍,比其他open addressing哈希表的实现(如tsl::hopscotch_map
和tsl::robin_map
)快3倍。至此,StrHash
是我所知最快的定长字元串查找解决方案,如果你知道更快的请告诉我。
推荐阅读: