我相信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
有人能告诉我是虫子还是我误会了什么吗。
每次启动最新版本的新实例(Python3.3+)到prevent dictionary insertion DOS attacks时,默认情况下
hash()
是随机的在此之前,32位和64位版本的
hash()
是不同的。如果您希望每次都将做的散列到同一个对象,请使用hashlib中的一个散列
像int这样的东西的散列依赖于id(),它不能保证在运行之间或解释器之间是常量。也就是说,hash(int)在程序运行期间始终会产生相同的结果,但在同一平台或不同平台上的运行之间可能不会比较相等。
顺便说一下,虽然散列随机化在Python中是可用的,但它在默认情况下是禁用的。因为字符串和数字的散列是相等的,所以这里显然不是问题所在。
对于旧的python(至少是我的python 2.7),似乎
对于CPython
id()
是内存中的地址-http://docs.python.org/2/library/functions.html#id所以我猜Android端口对内存地址有一些奇怪的约定?
无论如何,考虑到上述情况,类型的散列(以及我猜的其他内置)在不同的安装中会有所不同,因为函数位于不同的地址。
相比之下,值的散列(我认为您所说的“非内部对象”(在添加随机对象之前)是根据它们的值计算的,因此很可能是可重复的。
不过,至少还有一个CPython皱纹:
这里有个答案可以解释。。。
相关问题 更多 >
编程相关推荐