为何在不同机器上对numpy数组执行blake2b会得到不同结果?
问题
在两台不同机器(一台Linux、一台Windows,均为64位小端序)上运行以下Python代码,使用了相同版本的Python和numpy,但输出的blake2b哈希结果不同。打印数组字节内容时二者完全一致。
代码如下:
import numpy as np from hashlib import blake2b print(blake2b(np.array([1, 2, 3])).hexdigest())
原因分析与解决办法
核心问题:numpy数组对象直接传入哈希函数的处理差异
blake2b要求传入字节类对象,但直接传入numpy.ndarray实例时,哈希函数处理的不是数组的原始数据字节,而是numpy数组对象的内部完整表示——不同系统中,数组对象的一些隐藏元数据(比如内存管理相关的属性)可能存在细微差异,这些差异会被纳入哈希计算,导致结果不同。关键验证点
你已经确认数组的字节内容一致,说明数组的实际数据部分没有问题,问题出在数组对象本身的跨系统表示差异上。解决办法
提取数组的原始字节数据再传入哈希函数,修改后的代码如下:import numpy as np from hashlib import blake2b arr = np.array([1, 2, 3]) print(blake2b(arr.tobytes()).hexdigest())使用
arr.tobytes()可以精准获取数组的原始数据字节,这部分在符合小端序的64位系统中完全一致,因此哈希结果会统一。
内容的提问来源于stack exchange,提问作者Ray Bern
相关产品推荐
相关产品推荐

