pythonhashsl4a

Why doesn't Python hash function give the same values when run on Android implementation?


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.


Solution

  • 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...