【发布时间】:2019-02-25 23:40:01
【问题描述】:
hashlib 包含哈希算法的实现。不幸的是,对hashlib.sha256() 的两次连续调用不会产生两个不同的 SHA256 实例,而是产生同一个实例:如果调用两次 hashlib.sha256() 将每次返回相同的对象。所以显然我们这里有一个单身人士
这在需要任何类型的并发的所有情况下都是不好的。此外,在您想为某些算法提供散列对象的情况下,这非常糟糕。在我的例子中:测试失败,因为相同的对象被重用而不是创建一个新对象。
我的问题:我如何创建两个 SHA256(或任何其他哈希算法)实例?
例子:
import hashlib
print(hashlib.sha256())
print(hashlib.sha256())
这将输出如下内容:
<sha256 HASH object @ 0x7fb3611b4710>
<sha256 HASH object @ 0x7fb3611b4710>
【问题讨论】:
-
我无法重现此内容。我得到了两个不同的
<sha256 HASH object @ 0x101f9a260>对象……您能提供您用来确定这一点的代码吗?我怀疑你在滥用id(而是掉进了一个太常见的陷阱)。注意,对我来说hashlib.sha256() is hashlib.sha256()返回False -
这很奇怪。我也得到“假”,但它似乎是同一个对象。
-
那么就不是同一个对象了。正如我所怀疑的那样,您正在打印对象的表示形式,其中包括它的
id,即在此示例中为0x7fb3611b4710,因为在 CPython 中,只要引用计数达到零,对象被回收。该对象仅存在足够长的时间才能传递给print。 CPython 运行时优化分配,非常乐意重用最后一个对象的内存。 -
有趣。 GC 在我处理过的所有其他编程语言中的工作方式显然有点不同。非常感谢您的帮助!
标签: python python-3.x hashlib