4

我有缓存的哈希实例:

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)))

在此先感谢您的帮助!

4

1 回答 1

4

散列函数是一种单向函数,它使用可变长度的字节序列并产生固定长度的序列,即散列。所以hashlib实现与此同步,并没有提供一种提取输入序列的方法,至少不是一个清晰的方法。

IMO 从 OOP 的角度来看,它也很有意义,因为这样的哈希对象代表了一个哈希,因此它可以在它的位置使用并在没有未经授权的代码能够读取原始输入的情况下传递。不确定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)

# ...

散列部分散列的总和怎么样,这对你有用吗?

于 2014-07-11T07:35:43.487 回答