我有缓存的缓存实例:
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("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)))
提前感谢您的帮助!
答案 0 :(得分:4)
散列函数是单向函数,它使用可变长度的字节序列并生成固定长度序列,即散列。所以hashlib
实现与此一致,并没有提供一种拉出输入序列的方法,至少不是明确的。
hashlib
对象是否真的那么安全。
因此,要计算保持数据集可用并直接使用它们所需的所有组合。您可以使用hash.copy
方法重用部分哈希结果,如文档中所述:
hash.copy()
返回哈希对象的副本(“clone”)。这可以用于有效地计算共享公共初始子字符串的字符串的摘要。
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)
# ...
如何散列部分哈希值,对你有用吗?