【问题标题】:How to hash a variable in Python?如何在 Python 中对变量进行哈希处理?
【发布时间】:2014-07-23 08:09:20
【问题描述】:

这个例子运行良好example:

import hashlib
m = hashlib.md5()
m.update(b"Nobody inspects")
r= m.digest()
print(r)

现在,我想做同样的事情,但使用一个变量:var= "hash me this text, please"。我怎么能按照示例的相同逻辑来做呢?

【问题讨论】:

  • 你试过m.update(var)吗?
  • @tobias_k:这会出错;这不是字节值。
  • 供将来参考:不是每个人都知道hash.update() 需要字节,因此您的问题是当您尝试使用str 值时出现异常。下次在您的问题中包含该异常。
  • 这么想(听起来太容易了)但是当我尝试它时,我得到了相同的哈希码......不过,在 Python 2.7 上测试,而不是在 3 上
  • @tobias_k:但这是一个至关重要的区别; Python 3 从一开始就建立在 Unicode 和字节之间的明确区别之上。

标签: python python-3.x hashlib


【解决方案1】:

hash.update() method 总是需要 字节。

首先将 unicode 文本编码为字节;您将 编码为 的内容是应用程序的决定,但如果您要做的只是指纹文本,那么 UTF-8 是一个不错的选择:

m.update(var.encode('utf8')) 

然而,当你不这样做时你得到的异常很清楚:

>>> import hashlib
>>> hashlib.md5().update('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing

如果您正在获取 文件 的哈希,请改为以二进制模式打开文件:

from functools import partial

hash = hashlib.md5()
with open(filename, 'rb') as binfile:
    for chunk in iter(binfile, partial(binfile.read, 2048)):
        hash.update(chunk)
print hash.hexdigest()

【讨论】:

  • 我按照你给我的链接阅读了digest()方法:它可以接收一个很长的短语吗?我的意思是,如果我上面的变量是一个文本文件的内容(已经是这种情况),并且我的文本文件包含很多文本,digest() 会接受这么大的文件内容吗?
  • @begueradj:是的,它可以接受任何适合 Python 的东西。如果你正在阅读一个文本文件,你可以多次调用.digest(),每次调用下一个块。循环文件获取行,将每一行传递给.digest(),文件完成后获取摘要。
  • @begueradj: 或者你可以用binary模式打开文件,你就不用再编码了。
【解决方案2】:

试试这个。希望能帮助到你。 变量 var 必须是 utf-8 编码的。如果您输入一个字符串,即“Donald Duck”,则 var 变量将为 b'Donald Duck'。然后您可以使用 hexdigest() 对字符串进行哈希处理

#!/usr/bin/python3
import hashlib
var = input('Input string: ').encode('utf-8')
hashed_var = hashlib.md5(var).hexdigest()
print(hashed_var)

【讨论】:

    【解决方案3】:

    我遇到了与 OP 相同的问题。出于某种原因,我无法让以前的任何一个答案为我工作,但两者的结合有助于实现这个解决方案。

    我最初是像这样散列一个字符串;

    str = hashlib.sha256(b'hash this text')
    text_hashed = str.hexdigest()
    print(text_hashed)
    

    结果;d3dba6081b7f171ec5fa4687182b269c0b46e77a78611ad268182d8a8c245b40

    我的散列变量解决方案;

    text = 'hash this text'
    str = hashlib.sha256(text.encode('utf-8'))
    text_hashed = str.hexdigest()
    print(text_hashed)
    

    结果; d3dba6081b7f171ec5fa4687182b269c0b46e77a78611ad268182d8a8c245b40

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 2011-04-25
      • 1970-01-01
      相关资源
      最近更新 更多