【问题标题】:Computed value and return value for overridden hash function are different覆盖哈希函数的计算值和返回值不同
【发布时间】:2018-03-14 02:14:22
【问题描述】:

我为一个对象创建了一个 hash 函数。我遇到的问题是我在哈希函数中创建的值不是函数返回的值。

class someClass():

    def someClass(str1, str2, str3):
         self.str1 = str1
         self.str2 = str2
         self.str3 = str3
    ...
    def __hash__(self):
        hash_val = int(sha256((self.str1+ self.str2
                   + self.str3).encode('utf-8')).hexdigest(), 16)
        # print's 937929098002453100804....
        print(hash_val)
        return hash_val
 ...

  testClass = someClass('test', 'testClass', 'testCase')
  hashKey = hash(testClass)
  # print's 377513311013302392
  print(hashKey)

所以当我从 hash() 打印时,我得到93792909800245310080479536979750034401273674738852415427366199722413460820022, 但是当我打印 hashkey 我得到377513311013302392?为什么?

编辑:所以我明确地调用了hash(),得到了我期望的数字,但是由于我覆盖了hash(),我不应该从 hash() 获得相同的值吗?

【问题讨论】:

  • 你为什么打电话给hash(someClass)?你不是说hash(testClass)吗?
  • 是的,刚刚修好了
  • 这段代码是您使用的确切代码并且返回错误结果吗?
  • 是的,和我现在的代码很相似。
  • “非常相似”是不够的。向我们展示您真实代码的相关部分,或提供一个简短、完整的示例来演示错误。

标签: python python-3.x hash


【解决方案1】:

来自the docs

注意 hash() 将从对象的自定义 hash() 方法返回的值截断为 Py_ssize_t 的大小。这通常是 64 位版本的 8 个字节和 32 位版本的 4 个字节。

93792909800245310080479536979750034401273674738852415427366199722413460820022 远高于这些限制。

试试这个:

class C():

    def __hash__(self):
        return 93792909800245310080479536979750034401273674738852415427366199722413460820022

a = C()
b = C()

print(hash(a))
print(hash(b))

输出:

377513311013302392
377513311013302392

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2014-08-01
    • 2019-10-04
    • 1970-01-01
    • 2017-10-28
    • 2015-11-14
    • 2013-10-18
    相关资源
    最近更新 更多