如何在Python中散列大对象(数据集)?

25 python hash sha1 numpy pickle

我想计算包含Machine Learning数据集的Python类的哈希值.哈希意味着用于缓存,所以我想到md5sha1.问题是大多数数据都存储在NumPy数组中; 这些不提供__hash__()会员.目前我pickle.dumps()为每个成员做一个并根据这些字符串计算哈希.但是,我发现以下链接指示同一对象可能导致不同的序列化字符串:

为包含Numpy数组的Python类计算哈希的最佳方法是什么?

小智 29

感谢John Montgomery,我认为我找到了一个解决方案,而且我认为它比将可能很大的数组中的每个数字转换为字符串的开销要少:

我可以创建数组的字节视图,并使用它们来更新哈希.不知何故,这似乎与使用数组直接更新提供相同的摘要:

>>> import hashlib
>>> import numpy
>>> a = numpy.random.rand(10, 100)
>>> b = a.view(numpy.uint8)
>>> print a.dtype, b.dtype # a and b have a different data type
float64 uint8
>>> hashlib.sha1(a).hexdigest() # byte view sha1
'794de7b1316b38d989a9040e6e26b9256ca3b5eb'
>>> hashlib.sha1(b).hexdigest() # array sha1
'794de7b1316b38d989a9040e6e26b9256ca3b5eb'
Run Code Online (Sandbox Code Playgroud)


Joh*_*ery 3

数组中数据的格式是什么?难道你不能迭代数组,将它们转换成字符串(通过一些可重现的方式),然后通过更新将其输入到你的哈希中吗?

例如

import hashlib
m = hashlib.md5() # or sha1 etc
for value in array: # array contains the data
    m.update(str(value))
Run Code Online (Sandbox Code Playgroud)

不要忘记 numpy 数组不会提供,__hash__()因为它们是可变的。因此,请小心不要在计算哈希值后修改数组(因为它将不再相同)。