如何使用python中的现有hasher更新hashlib.md5 hasher?

时间:2014-07-11 06:30:10

标签: python md5 md5sum hashlib

我有缓存的缓存实例:

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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

散列函数是单向函数,它使用可变长度的字节序列并生成固定长度序列,即散列。所以hashlib实现与此一致,并没有提供一种拉出输入序列的方法,至少不是明确的。

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

# ...

如何散列部分哈希值,对你有用吗?