当前位置: 首页 > 面试题库 >

如何使对象正确地可哈希化?

解高昂
2023-03-14
问题内容

这是我的代码

class Hero:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name + str(self.age)

    def __hash__(self):
        print(hash(str(self)))
        return hash(str(self))

heroes = set()

heroes.add(Hero('Zina Portnova', 16)) # gets hash -8926039986155829407
print(len(heroes)) # gets 1

heroes.add(Hero('Lara Miheenko', 17)) # gets hash -2822451113328084695
print(len(heroes)) # gets 2

heroes.add(Hero('Zina Portnova', 16)) # gets hash -8926039986155829407
print(len(heroes)) # gets 3! WHY?

为什么会这样呢?
第一个和第三个对象具有相同的内容和相同的哈希值,但它们len()讲述了3个唯一的对象?


问题答案:

您还需要以__eq__()兼容的方式进行定义__hash__()–否则,相等性将基于对象身份。

在Python 2上,建议您还定义__ne__!=保持一致==。在Python 3上,默认__ne__实现将为__eq__您委托。



 类似资料:
  • 问题内容: 我了解为什么将可变对象放入字典很危险。但是,将所有列表/集合转换为元组/ frozensets是昂贵的;对于许多类型,根本没有容易获得的不可变版本。因此,有时值得直接散列可变对象,并采取适当的预防措施以确保所讨论的对象永远不会被修改。 在开始为可变对象实现非常复杂的自定义哈希函数之前,我想检查一下用作哈希函数是否存在任何缺点- 无论是在性能,碰撞还是其他方面。 问题答案: 出于类似的原

  • 我一直在研究散列/加密密码并将其存储在数据库中的正确方法。我知道盐和散列,所以我环顾四周,PBKDF2似乎是一个不错的选择。所以我找到了这个网站,它提供了一个很好的教程,以及一个适用于PHP的PBKDF2(这是我在我的网站上使用的)。 因此,我设置了我的网站,以使用这些功能生成/创建密码,但正如您在以下代码中看到的: salt在create_散列函数中生成,并存储在生成的散列中,该散列最终看起来像

  • 问题内容: 我需要一个Python / C / C ++ / Java实现,可以 暂停散列进步 和 商店 ,在这样一个文件进度的进展是 可恢复 从该文件在稍后阶段。 无论上面列出的是哪种语言编写的,它都应该可以在Python中正常工作。建议您提供它以便与“ hashlib”一起良好地工作,但这不是必需的。同样,如果已经存在这样的事物,那么到此的链接就足够了。 对于一个想法 ,您的实现应该实现什么。

  • 说a我在python3中有一个数据类。我希望能够散列和排序这些对象。 我只想在id上订购/散列它们。 我在文档中看到,我可以只实现_hash_和所有这些,但我想让数据类为我做这些工作,因为它们旨在处理这些。

  • 问题内容: 如何将ruby哈希对象转换为JSON?所以我在下面尝试这个例子,它不起作用? 我当时在看RubyDoc,显然对象没有方法。但是我正在阅读Rails支持并且也支持的博客。我可以理解是一个Rails对象,但不是Rails本身,它是一个纯Ruby对象。因此,在Rails中可以执行,但不能在纯Ruby中执行? 问题答案: Ruby的众多优点之一就是可以使用自己的方法扩展现有的类。这称为“类重新

  • 问题内容: 以下问题比最初看起来要复杂。 假设我有一个任意的JSON对象,其中可能包含任意数量的数据,包括其他嵌套的JSON对象。我想要的是JSON数据的加密哈希/摘要,而不考虑实际的JSON格式本身(例如:忽略换行符和JSON令牌之间的间距差异)。 最后一部分是要求,因为JSON将由许多不同平台上的各种(反)序列化器生成/读取。我知道至少有一个Java JSON库,该库在反序列化期间读取数据时会