哈希匹配算法在单片机上的应用

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

hash-match

哈希匹配算法在单片机上的应用

Github下载链接

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值