Python重写字符串__hash__

dar*_*sky 6 python hash class

我正在尝试为字符串创建自定义散列函数.我想按重量按字符频率散列字符串.这样hi并且ih会产生相同的哈希值.我可以覆盖__hash__吗?

或者正在创建一个包装类,它包含字符串和覆盖,__hash__并且__eq__是唯一的方法?

Sin*_*ion 4

您需要具有不同相等语义的派生类型。通常采用的方法是定义相等性如何工作,然后从派生的结构构建哈希方法,因为哈希值必须与相等性一致。那可能是:

import collections

class FrequencyString(str):
    @property
    def normalized(self):
        try:
            return self._normalized
        except AttributeError:
            self._normalized = normalized = ''.join(sorted(collections.Counter(self).elements()))
            return normalized

    def __eq__(self, other):
        return self.normalized == other.normalized

    def __hash__(self):
        return hash(self.normalized)
Run Code Online (Sandbox Code Playgroud)