重写哈希函数的计算值和返回值是不同的

时间:2018-03-13 18:00:54

标签: python python-3.x 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)

因此,当我从哈希()打印时,我得到93792909800245310080479536979750034401273674738852415427366199722413460820022, 但是当我打印hashkey时,我得到377513311013302392?为什么呢?

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

1 个答案:

答案 0 :(得分:2)

来自the docs

  

注意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