我相信hash()
函数在所有python解释器中都是一样的。但是当我使用python for android在我的手机上运行它时,它就不同了。对于散列字符串和数字,我得到了相同的散列值,但是当我散列内置数据类型时,散列值就不同了。
PC Python解释器(Python2.7.3)
>>> hash(int)
31585118
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101
Python解释器( 2.6.2)
>>> hash(int)
-2146549248
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101
有人能告诉我这是个bug还是我误解了什么吗?
发布于 2013-06-19 21:43:21
对于旧的python (至少是我的Python2.7),似乎
hash(<some type>) = id(<type>) / 16
对于CPython,id()
是内存中的地址- 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
这里有一个答案可以解释这个问题。
发布于 2013-06-19 21:34:48
默认情况下,每次启动prevent dictionary insertion DOS attacks的最新版本(Python3.3+)的新实例时,hash()
都是随机的
在此之前,hash()
对于32位和64位版本是不同的。
如果您想要每次都散列到相同的内容,请使用hashlib中的一个散列
>>> import hashlib
>>> hashlib.algorithms
('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
发布于 2013-06-19 21:31:54
像int这样的散列依赖于id(),而id()并不能保证两次运行或两次解释器之间的恒定。也就是说,在程序运行期间,hash(int)将始终产生相同的结果,但在同一平台或不同平台上的两次运行之间可能不同。
顺便说一句,虽然散列随机化在Python中可用,但默认情况下它是禁用的。既然你的字符串和数字的散列是一样的,显然这不是这里的问题。
https://stackoverflow.com/questions/17192418
复制相似问题