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

Windows平台C++中SHA-1哈希转GUID的单元测试方法咨询

搞定SHA-1哈希与GUID互转的单元测试问题

我来帮你解决这个单元测试的验证难题,核心就是把已知的SHA-1测试向量和你的GUID结构体做转换匹配,或者把生成的GUID转成可对比的字符串格式。


一、把已知SHA-1哈希转成GUID测试值

首先得明确Windows里GUID的内存布局:它是个16字节的结构体,拆分后是:

  • 4字节的DWORD(Data1)
  • 2字节的WORD(Data2)
  • 2字节的WORD(Data3)
  • 8字节的字节数组(Data4)

而SHA-1哈希是20字节,你的代码应该是取前16字节填充到GUID里(因为CryptGetHashParam会根据你传入的dwHashLen返回对应长度的哈希值,这里就是sizeof(GUID)=16)。

以你提供的测试向量为例:

测试字符串"abc"

已知SHA-1哈希:a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d
取前16字节对应的十六进制段:a9993e36 4706816a ba3e2571 7850c26c

按照GUID的字节序规则(Data1/Data2/Data3是小端存储,Data4按字符串顺序直接存储),你可以预定义预期的GUID:

GUID expectedGuid_Abc = {
    0xA9993E36,        // Data1:对应a9993e36,编译器自动转小端内存
    0x4706,            // Data2:对应4706
    0x816A,            // Data3:对应816a
    { 0xBA, 0x3E, 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C } // Data4:对应ba3e25717850c26c
};

测试长字符串abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq

已知SHA-1哈希:84983e44 1c3bd26e baae4aa1 f95129e5 e54670f1
取前16字节对应的预期GUID:

GUID expectedGuid_LongStr = {
    0x84983E44,
    0x1C3B,
    0xD26E,
    { 0xBA, 0xAE, 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5 }
};

单元测试时,直接用memcmp对比生成的guid和预定义的expectedGuid即可验证结果是否正确。


二、把生成的GUID转成字符串对比

如果你更习惯用字符串对比,Windows提供了现成的API,或者你可以手动实现转换:

方法1:用Windows API StringFromGUID2

WCHAR guidWideStr[40];
if (StringFromGUID2(guid, guidWideStr, ARRAYSIZE(guidWideStr))) {
    // 现在guidWideStr是类似"{A9993E36-4706-816A-BA3E-25717850C26C}"的格式
    // 你可以去掉大括号和连字符,得到纯十六进制字符串,再和已知SHA-1的前32个字符忽略大小写对比
}

方法2:手动格式化字符串

自己拼接每个字段的十六进制值,更灵活:

char sha1Prefix[33]; // 32个字符+结束符
sprintf_s(sha1Prefix, sizeof(sha1Prefix),
    "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X",
    guid.Data1,
    guid.Data2,
    guid.Data3,
    guid.Data4[0], guid.Data4[1],
    guid.Data4[2], guid.Data4[3],
    guid.Data4[4], guid.Data4[5],
    guid.Data4[6], guid.Data4[7]);
// 现在sha1Prefix是大写的"A9993E364706816ABA3E25717850C26C",直接和已知的小写/大写哈希前缀对比即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:04:09