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
相关产品推荐
相关产品推荐

