如何在Python中使用现有哈希器更新hashlib.md5哈希器?
我有一个已经缓存好的哈希实例:
m1 = hashlib.md5()
m1.update(b'very-very-long-data')
cached_sum = m1
我想用之前缓存的和来更新外部哈希:
def append_cached_hash(external_hasher):
# something like this
external_hasher.update(cached_sum)
可惜的是,这样做不行,因为update()方法需要的是字节数据。我可以再次传入同样的“非常非常长的数据”字节,但这就违背了为常见的长数据对象预先缓存md5和的整个想法。
我可以做一些类似下面的事情:
external_hasher.update(cached_sum.hexdigest())
但是,这样做的结果并不是我需要的:
external_hasher.update(b'very-very-long-data')
我该如何实现上面的功能呢?
同样的问题可以换个说法。现在有3个大数据集,需要用Python计算所有可能组合的md5和。每个数据源只允许计算一次md5。
m1 = hashlib.md5(b'very-big-data-1')
m2 = hashlib.md5(b'very-big-data-2')
m3 = hashlib.md5(b'very-big-data-3')
在下面的print函数的第二个参数中,我应该写什么才能达到目标呢?
print("sum for data 1 and data 2 is:", m1.update(m2))
print("sum for data 1 and data 3 is:", m1.update(m3))
print("sum for data 2 and data 3 is:", m2.update(m3))
print("sum for data 1, data 2 and data 3 is:", m1.update(m2.update(m3)))
提前感谢你的帮助!
1 个回答
5
哈希函数是一种单向函数,它可以处理任意长度的数据,然后输出一个固定长度的结果,叫做哈希值。所以,hashlib
的实现就是这样,它不提供一种简单的方法来提取输入的数据。
在我看来,从面向对象编程的角度来看,这样的哈希对象代表了一个哈希值,因此可以在需要的地方使用,并且在传递时不会让未经授权的代码读取到原始输入。不过,我不太确定hashlib
的对象是否真的那么安全。
要计算所有组合,你需要保持数据集可用,并直接使用它们。不过,你可以使用hash.copy
方法来重复使用部分哈希结果,正如文档中所建议的那样:
hash.copy()
返回哈希对象的一个副本(“克隆”)。这可以用来高效地计算共享相同初始子字符串的字符串的摘要。
import hashlib
d1 = 'data-1'
d2 = 'data-2'
d3 = 'data-3'
h1 = hashlib.md5(d1)
# instead of hashlib.md5(d1).update(d2), or hashlib.md5(d1 + d2)
h12 = h1.copy()
h12.update(d2)
# instead of hashlib.md5(d1).update(d3), or hashlib.md5(d1 + d3)
h13 = h1.copy()
h13.update(d3)
h2 = hashlib.md5(d2)
# instead of hashlib.md5(d2).update(d1), or hashlib.md5(d2 + d1)
h21 = h2.copy()
h21.update(d1)
# ...
那么,对部分哈希值的和进行哈希处理,这对你有用吗?