【问题标题】:How to create separate instances of a hash algorithm in Python?如何在 Python 中创建单独的哈希算法实例?
【发布时间】: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>

【问题讨论】:

  • 我无法重现此内容。我得到了两个不同的 &lt;sha256 HASH object @ 0x101f9a260&gt; 对象……您能提供您用来确定这一点的代码吗?我怀疑你在滥用id(而是掉进了一个太常见的陷阱)。注意,对我来说hashlib.sha256() is hashlib.sha256() 返回False
  • 这很奇怪。我也得到“假”,但它似乎是同一个对象。
  • 那么就不是同一个对象了。正如我所怀疑的那样,您正在打印对象的表示形式,其中包括它的 id,即在此示例中为 0x7fb3611b4710,因为在 CPython 中,只要引用计数达到零,对象被回收。该对象仅存在足够长的时间才能传递给print。 CPython 运行时优化分配,非常乐意重用最后一个对象的内存。
  • 有趣。 GC 在我处理过的所有其他编程语言中的工作方式显然有点不同。非常感谢您的帮助!

标签: python python-3.x hashlib


【解决方案1】:

在您的第一个示例中,第二个哈希对象是在您的第一个哈希对象被垃圾收集之后创建的。因此它们可以具有相同的内存地址。在hashlib.sha256() is hashlib.sha256() 中,第一个不能被垃圾收集,因为它必须首先进行比较。您可以将哈希对象保存在变量中以保持它们的生命:

h1 = hashlib.sha256()
h2 = hashlib.sha256()
print(h1 is h2)

[Output]
False

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 2011-09-20
    • 2012-06-03
    • 2016-03-05
    • 2014-12-12
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多