为什么Python hash函数在Android实现上运行时不提供相同的值?

2024-09-26 17:57:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我相信hash()函数在所有python解释器中的工作原理都是一样的。但当我使用python for android在手机上运行时,情况就不同了。对字符串和数字进行散列得到的散列值相同,但当对内置数据类型进行散列时,散列值不同。

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

有人能告诉我是虫子还是我误会了什么吗。


Tags: 函数字符串hellofor情况数字hash解释器
3条回答

每次启动最新版本的新实例(Python3.3+)到prevent dictionary insertion DOS attacks时,默认情况下hash()是随机的

在此之前,32位和64位版本的hash()是不同的。

如果您希望每次都将做的散列到同一个对象,请使用hashlib中的一个散列

>>> import hashlib
>>> hashlib.algorithms
('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')

像int这样的东西的散列依赖于id(),它不能保证在运行之间或解释器之间是常量。也就是说,hash(int)在程序运行期间始终会产生相同的结果,但在同一平台或不同平台上的运行之间可能不会比较相等。

顺便说一下,虽然散列随机化在Python中是可用的,但它在默认情况下是禁用的。因为字符串和数字的散列是相等的,所以这里显然不是问题所在。

对于旧的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端口对内存地址有一些奇怪的约定?

无论如何,考虑到上述情况,类型的散列(以及我猜的其他内置)在不同的安装中会有所不同,因为函数位于不同的地址。

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

不过,至少还有一个CPython皱纹:

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

这里有个答案可以解释。。。

相关问题 更多 >

    热门问题