hash-match
哈希匹配算法在单片机上的应用
hash-match设计前言
在单片机日常开发中,总会遇到根据收到的不同数据执行不同的程序,通常都会使用memcmp或者strcmp进行比较。
在匹配数据情况不多时,的确很合适。
但是一旦工程量变大,运行速度下降明显。比如有200个数据数组等待比较,每次都要比较很多次。
经常可以看到有的工程里if(memcmp()) {}后边有上百个else if(memcmp()) {},极度影响代码运行效率。
此时,将key的数组特征化,计算出特有的hash值,来代替比较,就可以给运行速度带来很大的提升。
HASH算法
hash-match库中提供了两种哈希算法:
Murmurhash3
MurmurHash是一种非加密函数的哈希函数,它能够产生出32-bit或128-bit哈希值。自称超级快的hash算法,是FNV的4-5倍。
MurmurHash算法由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc 、nginx、libmemcached,Redis,Memcached,Cassandra,HBase,Lucene等开源系统。
用户可以移植其他匹配算法,通过更改hash_match_caculate宏定义决定使用哪一种。
Simplehash
Simplehash是一种非常简单的哈希函数,它能够产生出32-bit哈希值。运行速度很快,更适合低速单片机使用。
使用方法
库中头文件参照了rt-thread中针对不同的编译器设置了不同的宏定义,目前支持MDK、IAR和GNU gcc。其他编译器暂未移植,一般来说已经满足使用。如果有其他编译器需求,请自行移植。
使用中只需要2个API函数和一个数据定义宏
HASH_MATCH_EXPORT(GROUP, NAME, hash_key_src, hash_key_len, handler, ...);
使用HASH_MATCH_EXPORT定义数据参数定义到指定代码段
HASH_MATCH_INIT(GROUP);
使用HASH_MATCH_INIT将初始化整个组内的哈希值
HASH_MATCH(GROUP, SRC, LEN, PARAMS);
使用HASH_MATCH将对提供的key进行哈希匹配
MDK和IAR编译器使用方法
MDK和IAR中都在软件内部进行更改了代码编译后的链接操作,可以很方便的使用,无需修改工程文件。
GROUP命名
选择一个GROUP名字,例如hash_match_test
注册命令
使用该名字定义该组下的所有命令,定义应当为全局变量定义,即放在函数外部
HASH_MATCH_EXPORT(hash_match_test, hash_match_test1, hash_match_test1key, sizeof(hash_match_test1key), hash_match_test1func, "this is test 1");
初始化GROUP
HASH_MATCH_INIT(hash_match_test);
匹配key
HASH_MATCH(hash_match_test, hash_match_test1key, sizeof(hash_match_test1key), NULL);
GUN gcc编译器使用方法
GUN gcc工程需要在工程的ld文件中找到非零变量的初始化链接代码。
hash-match具有分组信息,即使用时的GR

本文介绍了如何在单片机上使用哈希匹配算法提升程序运行效率,特别是当需要对比大量数据时。文章详细阐述了Murmurhash3和Simplehash两种哈希算法,并提供了在MDK、IAR和GNUgcc编译器下的使用方法。通过定义哈希值并进行匹配,可以显著减少比较次数,提高代码执行速度。此外,还讨论了如何在代码中移植和配置哈希算法,以及如何处理大小写通用匹配。最后,文章给出了一个示例,展示了如何快速定义和注册处理函数。
最低0.47元/天 解锁文章
643

被折叠的 条评论
为什么被折叠?



