I believed that hash()
function works the same in all python interpreters. But it differs when I run it on my mobile using python for android. I get same hash value for hashing strings and numbers but when I hash built-in data types the hash value differs.
PC Python Interpreter (Python 2.7.3)
>>> hash(int)
31585118
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101
Mobile Python Interpreter (Python 2.6.2)
>>> hash(int)
-2146549248
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101
Can any one tell me is it a bug or I misunderstood something.
for old python (at least, my Python 2.7), it seems that
hash(<some type>) = id(<type>) / 16
and for CPython id()
is the address in memory - http://docs.python.org/2/library/functions.html#id
>>> id(int) / hash(int)
16
>>> id(int) % hash(int)
0
so my guess is that the Android port has some strange convention for memory addresses?
anyway, given the above, hashes for types (and other built-ins i guess) will differ across installs because functions are at different addresses.
in contrast, hashes for values (what i think you mean by "non-internal objects") (before the random stuff was added) are calculated from their values and so likely repeatable.
PS but there's at least one more CPython wrinkle:
>>> for i in range(-1000,1000):
... if hash(i) != i: print(i)
...
-1
there's an answer here somewhere explaining that one...