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

在Android实现上运行时,为什么Python哈希函数没有给出相同的值?

漆雕安晏
2023-03-14
问题内容

我相信该hash()功能在所有python解释器中均相同。但是当我使用适用于android的python在移动设备上运行它时,情况有所不同。对于哈希字符串和数字,我得到相同的哈希值,但是当我对内置数据类型进行哈希时,哈希值不同。

PC Python解释器(Python 2.7.3)

>>> hash(int)
31585118
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101

移动Python解释器(Python 2.6.2)

>>> hash(int)
-2146549248
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101

谁能告诉我这是一个错误还是我误解了。


问题答案:

对于旧的python(至少是我的python 2.7),似乎

hash(<some type>) = id(<type>) / 16

并且对于CPythonid()是内存中的地址-http :
//docs.python.org/2/library/functions.html#id

>>> id(int) / hash(int)                                                     
16                                                                              
>>> id(int) % hash(int)                                                 
0

所以我的猜测是Android端口对内存地址有一些奇怪的约定吗?

无论如何,鉴于以上所述,类型(和其他内置函数)的哈希值在安装过程中会有所不同,因为函数位于不同的地址。

相比之下,值的哈希值(我认为您所说的“非内部对象”是指)(在添加随机对象之前)是根据值的哈希值计算的,因此很可能是可重复的。

PS,但至少还有一个CPython折皱:

>>> for i in range(-1000,1000):
...     if hash(i) != i: print(i)
...
-1

在某处有一个答案来解释那个…



 类似资料:
  • 我试图故意制造碰撞。 所以,我有和对象。我已经覆盖了Country的和方法,以便: india.hash代码()==india2.hash代码() 根据JavaHashMap中的冲突解决方案和文章“让这个国家对象在hashmap中”的一部分,如果key1的结果等于key2上的相同操作,那么应该会有冲突。 所以,我放置断点来查看的内容,并查看它的是2。也就是说,它包含两个不同的条目,并且没有link

  • 问题内容: 从这个问题出发,我很想知道何时 计算 python对象的哈希值? 在某个实例的时间 第一次叫 每次都被调用,或者 我还有其他机会吗? 这可能会根据对象的类型而有所不同吗? 为什么其他整数等于其哈希值呢? 问题答案: 通常可以在每次使用哈希时进行计算,因为您可以很容易地检查一下自己(请参阅下文)。当然,任何特定对象都可以自由缓存其哈希。例如,CPython字符串执行此操作,但元组不执行此

  • 下面的python代码尝试运行同一函数两次并输出运行时: 三次测试的输出如下: 我不知道为什么输出如此不同?为什么第二次执行比第一次快?我也尝试运行五次,结果如下:

  • 问题内容: 考虑下面的java代码。 输出量 价值的负值如何产生相同的价值? 但是结果不能是因为java中Integer的最大值是。 但是想知道为什么吗?内部正在发生哪种按位运算? 问题答案: 内部正在发生哪种按位运算? Java使用带符号数字的二进制补码表示。因此,更改符号操作包括两个步骤: 反转原始值的位,并 添加到结果中。 的表示如下: 反转产生 加法使其再次成为相同的数字,即 由于整数溢出

  • 也许我没有看到什么或者我忘记了在计算运行时考虑的事情,所以请告诉我。

  • 问题内容: 我看到了一个将函数应用于元组的代码示例。结果,它返回一个负整数。我想知道这个功能做什么?Google没有帮助。我找到了一个页面,该页面解释了哈希的计算方式,但没有解释为什么我们需要此函数。 问题答案: 哈希是一个固定大小的整数,用于标识特定值。每个值都需要有自己的哈希,因此对于相同的值,即使不是同一对象,您也将获得相同的哈希。 散列值的创建方式应使结果值均匀分布,以减少所得到的散列冲突