如何使用 python 中现有的哈希器更新 hashlib.md5 哈希器?

And*_*rew 5 python md5 hashlib md5sum

我有哈希器的缓存实例:

m1 = hashlib.md5()
m1.update(b'very-very-long-data')
cached_sum = m1
Run Code Online (Sandbox Code Playgroud)

我想用之前缓存的总和更新外部哈希器:

def append_cached_hash(external_hasher):
    # something like this
    external_hasher.update(cached_sum)
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不起作用,因为 update() 需要字节。我可以再次传递相同的“非常非常长的数据”字节,但它拒绝了为常见的长数据对象预缓存 md5 和的整个想法。

我可以做如下的事情:

external_hasher.update(cached_sum.hexdigest())
Run Code Online (Sandbox Code Playgroud)

但是,它不会产生与以下相同的所需结果:

external_hasher.update(b'very-very-long-data')
Run Code Online (Sandbox Code Playgroud)

我该如何实现上面的功能呢?


同样的问题可以有不同的表述。有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')
Run Code Online (Sandbox Code Playgroud)

下面的打印函数的第二个参数应该写什么才能达到目的?

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)))
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!

fam*_*kin 5

哈希函数是一种单向函数,它处理可变长度的字节序列并生成固定长度的序列(哈希)。因此,hashlib实现也随之而来,并且没有提供一种提取输入序列的方法,至少不是一个明确的方法。

\n

IMO 从 OOP 的角度来看,它也是有意义的,因为这样的哈希对象代表一个哈希,因此它可以在它的位置使用并传递,而无需未经授权的代码能够读取原始输入。但不确定hashlib对象是否真的那么安全。

\n

因此,要计算所有组合,您需要保持数据集可用并直接使用它们。不过,您可以使用该hash.copy方法重用部分哈希结果,如文档中所建议的:

\n
\n

hash.copy()

\n

返回哈希对象的副本 (\xe2\x80\x9cclone\xe2\x80\x9d)。这可用于有效地计算共享公共初始子字符串的字符串的摘要。

\n
\n
import hashlib\n\nd1 = \'data-1\'\nd2 = \'data-2\'\nd3 = \'data-3\'\n\nh1 = hashlib.md5(d1)\n# instead of hashlib.md5(d1).update(d2), or hashlib.md5(d1 + d2)\nh12 = h1.copy()\nh12.update(d2)\n# instead of hashlib.md5(d1).update(d3), or hashlib.md5(d1 + d3)\nh13 = h1.copy()\nh13.update(d3)\n\nh2 = hashlib.md5(d2)\n# instead of hashlib.md5(d2).update(d1), or hashlib.md5(d2 + d1)\nh21 = h2.copy()\nh21.update(d1)\n\n# ...\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n