这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 嵌入式项目中的数据散列应用

共2条 1/1 1 跳转至

嵌入式项目中的数据散列应用

院士
2026-07-08 17:14:02     打赏

数据散列(哈希)‌是计算机领域通过散列函数将任意长度输入转换为固定长度散列值的技术,核心目标是实现常数级O(1)的高效数据查找。

一、核心原理

它通过散列函数直接由数据项的值计算出对应的存储位置,无需遍历数据集,打破了顺序查找、二分查找的复杂度上限,能做到“指哪打哪”的常数级查找效率,生成的散列值也常被称为数据的“数字指纹”。

二、核心特性

  • 确定性:相同输入在同一算法下必然得到相同散列值

  • 单向性:无法从生成的散列值反推原始输入数据

  • 雪崩效应:输入的微小改动会导致散列值发生巨大且不可预测的变化

  • 抗碰撞性:难以找到两个不同输入生成完全相同的散列值

三、典型散列算法

它是散列表(哈希表)的核心支撑技术,广泛用于数据库索引、数据完整性校验、密码安全存储、数字签名、区块链工作量证明等场景,常见的标准散列算法包括MD5、SHA-2系列、SHA-3系列等。

四、嵌入式项目应用

在大型服务器应用项目里面,其算力性能与存储数据海量常常使用密码学中的安全散列算法,如MD5码,SHA-2,SHA-3等。但对于Cortex-M3、M4,M33或M7内核的MCU来说,上述安全散列算法还是过于复杂,负荷较重,故退而求其次多采用CRC32算法来做散列算法。

CRC32算法仍然属于广义的散列函数范畴,其由可打印ASCII字符组成的字符串,长度≤4字节时完全无碰撞;长度为5字节时碰撞概率约为2^-32.2184(就是特别特别的低),略低于理论值;长度≥6字节时,概率稳定趋近于‌2⁻³²(约2.33×10⁻¹⁰)‌。

从理论上验证了几乎不会发生碰撞,从算法实现上,大部分主流MCU已经搭载了计算CRC32算法的硬件外设,可以在几个HCLK周期下就计算出来结果。

从理论到实现都已经成熟、高效,那么具体的嵌入式应用又有哪些呢?我这里举一个例子,做到抛砖引玉的作用,大家可以依自已的项目需求自行发挥。

五、CRC32算法散列应用

我在做串口命令CLI输入的时候,常常看到大家在对命令的识别的时候使用strcmp()命令函数。这个函数将源命令字符串与目的字符串进行逐字节比较,当全部对比成功后返回零,否则返回非零。程序依返回结果与零比较,得出来命令与内置的命令是否一致,再执行对应的,示例代码如下:

cmd_list_t cmd_list[] = {
    {"help", cmd_help_func},
    {"version", cmd_version_func},
    {"ledon", cmd_ledon_func},
    {"ledoff", cmd_ledoff_func},
}

int main(void)
{
    uint8_t i;
    for(i = 0; i < cmd_list_nr; i++)
    {
        if(strcmp(cmd_name_in, cmd_list[i].name) == 0)
        {
            cmd_list[i].func();        
        }    
    }
}

通过上面的源代码可以看到,核心判断是第13行的strcmp()命令。这个框架也是非常成熟,而且对命令的扩展支持也非常好。也可以从上述源代码看到,其算法复杂度绝对不是O(1),所以散列算法的优势还是有的。那么如果使用散列算法如何实现呢?!

cmd_list_t cmd_list[] = {
    {"help", cmd_help_func, 0xAC5C8708},
    {"version", cmd_version_func, 0xC3D31CBF},
    {"ledon", cmd_ledon_func, 0xAB32A991},
    {"ledoff", cmd_ledoff_func, 0xBA729FFF},
}

int main(void)
{
    uint8_t i;
    uint32_t cmd_index;
    cmd_index = crc32_calc(cmd_name_in);
    for(i = 0; i < cmd_list_nr; i++)
    {
        if(cmd_index == cmd_list[i].index)
        {
            cmd_list[i].func();        
        }    
    }
}

使用散列来判断输入的命令行是哪个命令,这样是不是更加简单了?





关键词: 散列    

助工
2026-07-09 23:39:59     打赏
2楼

这个东西还能这么用啊!

学习了,涨知识了


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]