使用对象的 id() 作为哈希值

eda*_*ley 5 python hash

__hash__像这样实施是个坏主意吗?

class XYZ:
    def __init__(self):
        self.val = None

    def __hash__(self):
        return id(self)
Run Code Online (Sandbox Code Playgroud)

我是否设置了一些潜在的灾难性的东西?

Bak*_*riu 5

__hash__方法必须满足以下要求才能工作:

对于所有 x, y 使得x == y,则hash(x) == hash(y)

在您的情况下,您的类没有实现__eq__,这意味着x == y当且仅当id(x) == id(y),因此您的哈希实现满足上述属性。

但是请注意,如果您确实实施了,__eq__那么此实施可能会失败。

另外:拥有“有效”__hash__和拥有良好的散列之间是有区别的。例如,以下是任何类的有效__hash__定义:

def __hash__(self):
    return 1
Run Code Online (Sandbox Code Playgroud)

一个好的散列应该尝试均匀分布对象,以尽可能避免冲突。通常这需要更复杂的定义。我会避免尝试提出公式,而是依赖 python 内置hash函数。

例如,如果你的类有田abc那么我会使用这样的__hash__

def __hash__(self):
    return hash((self.a, self.b, self.c))
Run Code Online (Sandbox Code Playgroud)

hashfor tuples的定义对于一般情况应该足够好。

最后:您不应该__hash__在可变的类中定义(在用于相等的字段中)。那是因为修改实例会改变它们的散列,这会破坏事情。