【问题标题】:Python: how to create a hash of nested containersPython:如何创建嵌套容器的哈希
【发布时间】:2010-11-17 06:25:36
【问题描述】:

[Python 3.1]

我正在尝试为其中可能包含嵌套容器且深度未知的容器创建哈希。在层次结构的所有级别上,只有内置类型。这样做的好方法是什么?

我为什么需要它:

我将一些计算的结果缓存在 pickle 对象中(在磁盘上)。如果使用不同的参数调用函数,我需要使缓存文件无效(这种情况很少发生,所以我不会将多个文件保存到磁盘)。哈希将用于比较参数。

【问题讨论】:

  • 您是否希望这些值在创建后能够更改?
  • @aaronsterling:你能澄清一下吗?我不确定我是否在回答您的问题,但容器或其内容不会被修改。然而,我必须强调的是,这个 Python 程序的任何未来调用(在一个新进程中)当然需要持久性。
  • 所以您认为文件可能不会被不同的函数参数无效的可能性很小吗?任何散列函数都有可能发生冲突,因此您正在寻找一个具有最小冲突机会的函数。只是想更好地理解这个问题。
  • @Scott Griffiths 是的,我认为这个问题发生的可能性很小。虽然我猜这表明当参数不是很大时,序列化比散列更安全。

标签: python hash python-3.x containers nested


【解决方案1】:

如果所有容器都是元组,并且所有包含的对象都是可散列的,那么主容器应该是可散列的。

【讨论】:

  • 好点。不幸的是,容器中有字典。
  • 您可以将字典转换为(键,值)元组的排序元组。
【解决方案2】:

您可以将参数序列化为 JSON 之类的内容,然后将其用于哈希。

【讨论】:

  • 我喜欢这个主意。这有什么隐藏的问题吗?例如,它会在一些复杂的嵌套结构等上中断吗?
  • 不,只要它只是元组、列表、字典、strs 和 int 就可以了。但是需要注意一点:tuple == list(因为 JavaScript 没有 tuple 概念)
  • 我想我会使用pickle.dumps 而不是json.dumps;泡菜的类型精确,速度快约 15%(我对它们进行了计时)。
  • @ChrisMorgan 我才意识到我在 2 年后问了一个 related question... 评论和回答说我应该使用pickle,因为它对于未排序的对象是不可预测的,并且比手动转换为可散列对象要慢。总有一天我会采用不同的方法。
【解决方案3】:

我会将 json 序列化为一个字符串 [如果仍然需要,然后散列该字符串]。

from simplejson import dumps

def hash_data(data):
    return hash(dumps(data))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多