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

何时计算python对象的哈希值,为什么-1的哈希值不同?

戚甫
2023-03-14
问题内容

从这个问题出发,我很想知道何时 计算 python对象的哈希值?

  1. 在某个实例的__init__时间
  2. 第一次__hash__()
  3. 每次都__hash__()被调用,或者
  4. 我还有其他机会吗?

这可能会根据对象的类型而有所不同吗?

为什么hash(-1) == -2其他整数等于其哈希值呢?


问题答案:

通常可以在每次使用哈希时进行计算,因为您可以很容易地检查一下自己(请参阅下文)。当然,任何特定对象都可以自由缓存其哈希。例如,CPython字符串执行此操作,但元组不执行此操作(例如,出于原因,请参见此拒绝的错误报告)。

哈希值-1表示CPython中有错误。这是因为C没有异常,因此它需要使用返回值。当Python对象__hash__返回-1时,CPython实际上会将其静默更改为-2。

你自己看:

class HashTest(object):
    def __hash__(self):
        print('Yes! __hash__ was called!')
        return -1

hash_test = HashTest()

# All of these will print out 'Yes! __hash__ was called!':

print('__hash__ call #1')
hash_test.__hash__()

print('__hash__ call #2')
hash_test.__hash__()

print('hash call #1')
hash(hash_test)

print('hash call #2')
hash(hash_test)

print('Dict creation')
dct = {hash_test: 0}

print('Dict get')
dct[hash_test]

print('Dict set')
dct[hash_test] = 0

print('__hash__ return value:')
print(hash_test.__hash__())  # prints -1
print('Actual hash value:')
print(hash(hash_test))  # prints -2


 类似资料:
  • 使用web3.utils.sha3()方法计算给定字符串的sha3哈希值。 注意,如果要模拟solidity中的sha3,请使用soliditySha3函数。 调用: web3.utils.sha3(string) web3.utils.keccak256(string) // ALIAS 参数: string - String: 要计算sha3哈希值的字符串 返回值: String: 计算结果

  • 问题内容: 我正在阅读Java 1.6 API提供的HashMap类的代码,无法完全理解以下操作的需要(位于put和get方法的主体中): 该方法具有以下主体: 通过对提供的哈希码执行位操作,可以有效地重新计算哈希。即使API声明如下,我也无法理解这样做的必要性: 这很关键,因为HashMap使用2的幂的哈希表,否则哈希表在低位无差异时会遇到冲突。 我确实知道键值参数存储在数据结构数组中,并且该数

  • 问题内容: 我不知道如何实现从php到java的这几行。 好吧,我尝试将其转换,但是得到了不同的结果! java中的结果不同于php中的结果。 你能帮我吗??先感谢您 :) 问题答案: 您不能在不将其转换为字符串的情况下直接使用seq20吗?我会这样:

  • 我想向用户展示他们的客户端工具也可能生成的散列,因此我一直在比较在线散列工具。我的问题是关于它们的散列形式,因为奇怪的是,它们是不同的。 在快速搜索之后,我用5进行了测试: http://www.convertstring.com/hash/sha256 http://www.freeformatter.com/sha256-generator.html#ad-output http://onli

  • 我刚刚讨论了散列码的概念,遇到了一行:

  • 问题内容: 我偶然发现了一篇博客文章,详细介绍了如何在Python中实现powerset函数。因此,我尝试用自己的方式进行操作,并发现Python显然无法拥有一组集合,因为set无法哈希。这很烦人,因为功率集的定义是它是一组集合,而我想使用实际的集合操作来实现它。 Python集不可散列是否有充分的理由? 问题答案: 通常,在Python中只有不可变的对象才是可哈希的。的不可变的变体- -是哈希的