我相信hash()所有python解释器中的函数都是一样的.但是当我使用python for android在我的手机上运行它时它会有所不同.我得到哈希字符串和数字的哈希值相同,但是当我对内置数据类型进行哈希时,哈希值会有所不同.
PC Python解释器(Python 2.7.3)
>>> hash(int)
31585118
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101
Run Code Online (Sandbox Code Playgroud)
移动Python解释器(Python 2.6.2)
>>> hash(int)
-2146549248
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我这是一个错误还是我误解了一些东西.
Joh*_*ooy 35
hash()默认情况下,每次启动新版本的最新版本(Python3.3 +)时都会随机化,以防止字典插入DOS攻击
在此之前,hash()无论如何,32位和64位版本都有所不同.
如果你想要的东西,做散每次都一样的东西,使用hashlib散列之一
>>> import hashlib
>>> hashlib.algorithms
('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
Run Code Online (Sandbox Code Playgroud)
and*_*oke 10
对于旧的python(至少,我的Python 2.7),似乎
hash(<some type>) = id(<type>) / 16
Run Code Online (Sandbox Code Playgroud)
而CPython id()是内存中的地址 - http://docs.python.org/2/library/functions.html#id
>>> id(int) / hash(int)
16
>>> id(int) % hash(int)
0
Run Code Online (Sandbox Code Playgroud)
所以我的猜测是Android端口对内存地址有一些奇怪的约定?
无论如何,鉴于上述情况,类型的哈希(以及我猜的其他内置函数)在安装过程中会有所不同,因为函数位于不同的地址.
相比之下,值的哈希(我认为你的意思是"非内部对象")(在添加随机内容之前)是根据它们的值计算的,因此很可能是可重复的.
PS但是至少还有一个CPython皱纹:
>>> for i in range(-1000,1000):
... if hash(i) != i: print(i)
...
-1
Run Code Online (Sandbox Code Playgroud)
这里有一个答案可以解释一个......