python - 在 Python 中计算对象的哈希值

标签 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))

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

更新:为什么我要散列节点?

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

最佳答案

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

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

我没有测试,所以我不知道成本。

关于python - 在 Python 中计算对象的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20367692/

相关文章:

python - 未以管理员身份运行时出现 "cannot create temp dir for user data dir"错误

python - 如何让 PySpark 在内存不足之前将中间结果写入磁盘?

python - 使用 pandas 计算 csv 中的句子和单词数

python - 在 python 中更改绘图标签的大小

c# - 字节串在python和c#中是相同的,但是md5 hashcode是不同的

arrays - Perl 将哈希值数组输出为表

windows - 如何将提交哈希添加到可执行文件的详细信息

node.js - 注册时如何对我的 mongoose Passport js 密码进行哈希处理?

c++ - 哈希表 : Double hashing when the second hash function returns a multiple of the table size

jquery - window.location.hash - 停止在 Chrome 中重新加载