首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Python哈希函数在Android实现上运行时没有给出相同的值?

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

Stack Overflow用户
提问于 2013-06-19 21:24:51
回答 5查看 58.5K关注 0票数 28

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

PC Python解释器(Python2.7.3)

代码语言:javascript
复制
>>> hash(int)
31585118
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101

Python解释器( 2.6.2)

代码语言:javascript
复制
>>> hash(int)
-2146549248
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101

有人能告诉我这是个bug还是我误解了什么吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-06-19 21:43:21

对于旧的python (至少是我的Python2.7),似乎

代码语言:javascript
复制
hash(<some type>) = id(<type>) / 16

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

代码语言:javascript
复制
>>> id(int) / hash(int)                                                     
16                                                                              
>>> id(int) % hash(int)                                                 
0                                                                               

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

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

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

另外,至少还有一个CPython问题:

代码语言:javascript
复制
>>> for i in range(-1000,1000):
...     if hash(i) != i: print(i)
...
-1

这里有一个答案可以解释这个问题。

票数 10
EN

Stack Overflow用户

发布于 2013-06-19 21:34:48

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

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

如果您想要每次都散列到相同的内容,请使用hashlib中的一个散列

代码语言:javascript
复制
>>> import hashlib
>>> hashlib.algorithms
('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
票数 36
EN

Stack Overflow用户

发布于 2013-06-19 21:31:54

像int这样的散列依赖于id(),而id()并不能保证两次运行或两次解释器之间的恒定。也就是说,在程序运行期间,hash(int)将始终产生相同的结果,但在同一平台或不同平台上的两次运行之间可能不同。

顺便说一句,虽然散列随机化在Python中可用,但默认情况下它是禁用的。既然你的字符串和数字的散列是一样的,显然这不是这里的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17192418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档