You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将旧MASM校验和代码移植为C语言后,求识别其相似算法

自定义校验和算法与已知算法的相似性分析

我近期将一段用于计算缓冲区或文件校验和的旧MASM代码移植为C语言,想了解该算法与哪种已知校验和算法相似,以下是正确的C语言实现:

#include <stdio.h>
#include <stdint.h>

uint32_t computeChecksum(uint8_t *data, size_t dataLength) {
    uint32_t checksum = 0;
    int rotateBits = 0;

    for (size_t i = 0; i < dataLength; i += 4) {
        // 以32位数据块为单位处理
        uint32_t chunk = *(uint32_t*)(data + i);
        // 执行循环左移操作
        chunk = (chunk << rotateBits) | (chunk >> (32 - rotateBits));
        // 将移位后的块与当前校验和异或
        checksum ^= chunk;
        // 左移位数逐块递增1,达到32后循环归零
        rotateBits = (rotateBits + 1) % 32;
    }

    return checksum;
}

int main() {
    uint8_t data[32] = {
        0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
        0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
        0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
        0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20
    };

    uint32_t checksum = computeChecksum(data, sizeof(data));
    printf("Checksum: 0x%08X\n", checksum);

    return 0;
}

算法核心逻辑

  • 按32位数据块遍历输入数据(注:代码未处理数据长度非4字节倍数的情况)
  • 对每个数据块执行循环左移(ROL),移位位数从0开始逐块加1,到32后重置为0
  • 将移位后的块与累计校验和做**异或(XOR)**运算,更新校验和

与已知算法的对比

这个算法不属于CRC32、Adler-32、MD5、SHA系列这类标准校验和/哈希算法,但有几个值得注意的关联点:

  1. 类似简单异或校验的增强版:普通异或校验仅对数据块做异或累计,对数据块重排不敏感;而该算法通过逐块递增的移位操作,让数据块的顺序直接影响最终结果,提升了对顺序变化的敏感度,但本质仍属于弱校验。
  2. 移位+异或的组合类似轻量级加密/哈希的轮操作:部分轻量级哈希或流加密算法会用到循环移位结合异或的操作,但这类算法通常会加入加法、多轮迭代等复杂逻辑,该算法的设计则更简洁单一。
  3. 弱碰撞抗性:由于仅依赖异或运算,该算法的碰撞概率较高,容易构造出具有相同校验和的不同数据,仅适合对安全性要求低的内部完整性校验场景。

内容的提问来源于stack exchange,提问作者vengy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:15:04