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

如何在python中实现良好的__hash__函数

钱浩荡
2023-03-14
问题内容

当实现具有多个属性的类时(例如下面的玩具示例),处理哈希的最佳方法是什么?

我认为__eq____hash__应该是一致的,但是如何实现能够处理所有属性的适当的哈希函数呢?

class AClass:
  def __init__(self):
      self.a = None
      self.b = None

  def __eq__(self, other):
      return other and self.a == other.a and self.b == other.b

  def __ne__(self, other):
    return not self.__eq__(other)

  def __hash__(self):
      return hash((self.a, self.b))

问题答案:

__hash__对于相等的对象应返回相同的值。它也不应在对象的整个生命周期内发生变化。通常,您只为不可变的对象实现它。

一个简单的实现就是公正return 0。这始终是正确的,但效果很差。

您的解决方案,返回一个属性元组的哈希,是很好的。但是请注意,您无需列出__eq__在元组中进行比较的所有属性。如果某些属性对于不相等的对象通常具有相同的值,则将其省略。不要使散列计算的成本超出其所需的成本。

编辑:我建议一般不要使用xor混合哈希。当两个不同的属性具有相同的值时,它们将具有相同的哈希值,并且通过xor进行相互抵消。元组使用更复杂的计算来混合哈希,请参见tuplehash中的tupleobject.c



 类似资料:
  • 从Udacity的深度学习类来看,y_i的软最大值只是指数除以整个Y向量的指数之和: 其中< code>S(y_i)是< code>y_i的softmax函数,而< code>e是指数,而< code>j是输入向量y中的列数 我尝试了以下方法: 返回: 但建议的解决方案是: 它产生与第一个实现相同的输出,即使第一个实现显式地取每列和max的差值,然后除以总和。 有人能用数学说明为什么吗?一个正确,

  • 问题内容: 我们中的许多人都需要处理用户输入,搜索查询以及输入文本可能包含亵渎或不受欢迎语言的情况。通常,这需要过滤掉。 在哪里可以找到各种语言和方言的咒骂单词的好清单? 是否有API可供包含良好列表的来源使用?还是仅使用某些参数简单地说“是的干净”或“没有这个脏”的API? 有什么好的方法可以捕获试图欺骗系统的人员,例如a $$,azz或a55? 如果您提供PHP解决方案,则可以加分。:) 编辑

  • 问题内容: 我经常使用时髦的东西作为字典的键,因此,我想知道什么是正确的方法-这是通过为对象实现良好的哈希方法实现的。我知道这里提出的其他问题[是实现 hash的好方法,但我想了解默认值如何用于自定义对象,以及是否有可能依赖它。 我注意到可变项显然是不可哈希的,因为会引发错误……但是奇怪的是,自定义类是可哈希的: 那么,有人知道此默认哈希函数如何工作吗?通过了解这一点,我想知道: 如果我放置与字典

  • 问题内容: 我以前的编程中,代码段仅用于调试目的(记录命令等)。通过使用预处理程序指令,可以完全禁用这些语句以进行生产,如下所示: 做类似的事情的最好方法是什么? 问题答案: 如果只想禁用日志记录方法,请使用该模块。如果日志级别设置为排除调试语句,那么它将非常接近无操作(它仅检查日志级别并返回而不插入日志字符串)。 如果要在特定条件下以字节码编译时实际删除代码块,则唯一的选择是相当神秘的全局变量。

  • 我刚开始使用OpenNLP。我需要创建一个简单的训练模型来识别名称实体。