[已解决] Python调用DLL实现哈希算法计算,返回结果不完全的问题
一、问题简述
在项目中有对字符串、文件进行哈希计算需求,目前哈希算法采用的是SM3。SM3输出为256位的数值,在本项目中以16进制字符串返回,故应返回长度为64的字符串。然而在使用过程中发现经常发生返回值不全的现象。
二、出错情况与源码描述
对字符串或文件进行哈希计算,出错示例:
计算某数据哈希值正确返回结果应为:0B0BA29227383B3776B29D788FBEB917F5AB45B20D84B512D9F69AE2C8F7C725
结果仅返回:
0B0BA29227383B377
# 计算字符串哈希
sm3().cal_sm3(str)
# 计算文件哈希
sm3().sm3_file(filepath)
SM3类构造方法
def __init__(self):
# 确定DLL文件位置
dll_path = os.path.join(BASE_DIR, "libs", "export_sm3.dll")
# 加载DLL文件
self.sm3dll = cdll.LoadLibrary(dll_path)`
字符串SM3计算函数:
def cal_sm3(self, buf):
# output: 返回值 unsigned char [32]
output = (c_char * 32)()
# inp:传入带计算字符串 转为C unsigned char类型
inp = create_string_buffer(buf.encode(), len(buf))
# 调用DLL
self.sm3dll.sm3(inp, len(buf), output)
# 以16进制字符串返回计算结果
return self.return_res(output)
转16进制方法
def return_res(self, out):
return out.value.hex().upper()
三、原因猜测与尝试方案
1. I/O性能不足
一开始以为是I/O读取速率跟不上,但换机器也会出现该问题。
2. DLL出错
DLL的源码由C实现,采用国标,无误。直接用C运行没有发生出错的情况。
已解决,\0原因,转换为create_string_buffer方法进行传参即可