在Python中计算对象的哈希值

时间:2013-12-04 05:33:15

标签: python hash

我想将BeautifulSoup的Node对象放入dict中,我想覆盖__hash__以根据节点的路径提供自己的哈希实现。

def __hash__(self):
    def convert_attrs(attrs):
        for k, v in attrs.iteritems():
            if isinstance(v, list):
                v = tuple(v)
            yield k, v

    reverse_path = []
    node = self.node
    while node:
        node_id = (node.name,
                   tuple(convert_attrs(node.attrs)),
                   node.text)
        reverse_path.append(node_id)
        node = node.parent
    return hash(tuple(reverse_path))

但是这会在一些具有完全相同路径和attrs的节点上产生冲突。我可以在父的子集合中使用node的索引来构造一个唯一的路径,但是查找索引的成本太高。那么在html节点对象上实现__hash__的任何好建议呢?无论如何要实现不基于路径但仍能正常工作的哈希?

更新:为什么我要哈希节点?

我想给每个节点一个分数,所以我需要一些东西作为放入哈希的关键。 BeautifulSoup似乎返回具有不同对象的相同节点(我的意思是它在再次访问同一节点时创建新节点),所以我想找到一种方法来唯一地标识散列中的节点。

1 个答案:

答案 0 :(得分:0)

假设有两个节点,它们的标签相同,属性相同,父节点相同,内容相同,但它们不同,因为它们是兄弟节点。如果你想区分它们,我认为你必须找到索引。您可以使用nextSiblingpreviousSibling,例如

i,t = 0 , node
while t:
    t = t.previousSibling
    i += 1

我不测试,所以我不知道费用。