python中的哈希函数

bkm*_*ron 28 python hash sl4a

我相信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)

  • 但是,没有一个hashlib算法散列数据类型. (2认同)

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)

这里有一个答案可以解释一个......