【问题标题】:python - How can I have a persistent hash from a tuple?python - 如何从元组中获得持久哈希?
【发布时间】:2019-05-25 04:05:53
【问题描述】:

我需要从一个元组生成一个哈希。理想情况下,我希望能够从列表中做到这一点,但这是不可能的。我需要一些东西,我可以使用哈希来生成元组,最终以正确的顺序访问包含项目的原始列表(项目将是字符串)。

这就是我要散列的内容

l = ['x', 'y', 'z']
t = tuple(l)

我尝试使用 hash(),但最终没有在 Python 会话中提供相同的哈希值,这是我需要的。

我需要哈希,因为我想基于该列表创建一个文件,并将哈希作为文件名。然后我想查找文件名并能够仅使用哈希访问列表项(以正确的顺序)。

我的理解是这是可能的,但我可能是错的。有什么想法吗?

【问题讨论】:

  • “我需要一些可以使用散列来生成元组的东西”——那么你需要的不是散列。哈希并不是为了让您恢复原始输入而设计的。
  • 很公平,那我应该看看什么?
  • @user2357112:也许是措辞。 “需要哈希...”段落更好地描述了用例:哈希作为文件名从保存值的文件中检索存储的值。

标签: python list hash tuples


【解决方案1】:

您可以使用 MD5,它速度很快,并且对于相同的输入总是会为您提供相同的结果。

import hashlib
    
t = ('x', 'y', 'z')

m = hashlib.md5()
for s in t:
    m.update(s.encode())
fn = m.hexdigest() # => 'd16fb36f0911f878998c136191af705e'

正如 user2357112 所说,您不能从 fn 重构 l;但是如果l 被保存在带有 MD5 哈希值的文件中,您将能够读取它。

【讨论】:

  • 最后一部分就是这样,将l 保存在文件中似乎是要走的路。谢谢!
【解决方案2】:

不,如果您的元组包含字符串并且使用内置 hash(),则这是不可能的。

字符串的哈希值在 Python 会话中被有意设置为变量,因为在 Python 3.4 中,它导致了潜在的安全问题 (PEP 456)。在 Python 3.5 中,通过在每个 Python 会话中设置不同的字符串哈希值来解决此问题。

我建议您创建自己的散列函数以使其稳定,或者使用一些hashlib

【讨论】:

  • 如果我早点发现它,这将节省我几个小时......
【解决方案3】:

哈希在理论上是不可逆的。加密似乎是你想要的。比如base64

================== 更新

base64 是编码技术。enter link description here

也许你想要加密或编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2010-12-19
    • 2018-09-18
    • 2015-01-06
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多