[已解决] 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运行没有发生出错的情况。

dll
最佳答案

已解决,\0原因,转换为create_string_buffer方法进行传参即可

1年前 评论
讨论数量: 2

output = (c_char * 32)() 这个确定没有问题?换成256看看

1年前 评论

已解决,\0原因,转换为create_string_buffer方法进行传参即可

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!