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