fonction de hachage en python

je pense que hash() la fonction fonctionne de la même façon pour tous les interprètes python. Mais il diffère quand je l'exécute sur mon mobile en utilisant python pour android. J'obtiens la même valeur de hachage pour le hachage des chaînes et des nombres mais quand je hachais les types de données intégrés la valeur de hachage diffère.

PC de l'Interpréteur Python (Python 2.7.3)

>>> hash(int)
31585118
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101

Interpréteur Python Mobile (Python 2.6.2)

>>> hash(int)
-2146549248
>>> hash("hello sl4a")
1532079858
>>> hash(101)
101

quelqu'un Peut-il me dire c'est un bug ou j'ai mal compris quelque chose.

22
demandé sur bkmagnetron 2013-06-19 17:24:51

5 réponses

pour les vieux python (au moins, mon Python 2.7), il semble que

hash(<some type>) = id(<type>) / 16

et pour CPython id() est l'adresse dans la mémoire - http://docs.python.org/2/library/functions.html#id

>>> id(int) / hash(int)                                                     
16                                                                              
>>> id(int) % hash(int)                                                 
0                                                                               

donc à mon avis, Le port Android a une étrange convention pour les adresses mémoire?

quoi qu'il en soit, Compte tenu de ce qui précède, les hachages pour les types (et autres encastrés je suppose) différeront d'une installation à l'autre parce que les fonctions sont différentes adresse.

en revanche, les hachages pour les valeurs (ce que je pense que vous voulez dire par "objets non internes") (avant que le truc aléatoire ait été ajouté) sont calculés à partir de leurs valeurs et donc probablement reproductibles.

PS mais il y a au moins un de plus Disponible ride:

>>> for i in range(-1000,1000):
...     if hash(i) != i: print(i)
...
-1

il y a une réponse quelque part qui explique celle-là...

8
répondu andrew cooke 2013-06-19 15:41:34

hash() aléatoire par défaut chaque fois que vous démarrez une nouvelle instance de versions récentes (Python3.3+)prévenir dictionnaire d'insertion des attaques DOS

Avant cela, hash() était différent pour les constructions 32bit et 64bit de toute façon.

Si vous voulez quelque chose qui hachez à la même chose à chaque fois, utilisez un des hachages en hashlib

>>> import hashlib
>>> hashlib.algorithms
('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
29
répondu John La Rooy 2013-06-19 13:42:20

le hachage de choses comme int repose sur id (), qui n'est pas garanti constant entre les passages ou entre les interprètes. C'est-à-dire que le hachage(int) produira toujours le même résultat lors de l'exécution d'un programme, mais ne comparera peut-être pas les mêmes cycles, que ce soit sur la même plate-forme ou sur des plates-formes différentes.

BTW, alors que la randomisation du hash est disponible en Python, elle est désactivée par défaut. Puisque vos chaînes et vos nombres sont impeccables, il est clair que ce n'est pas le problème ici.

1
répondu Sneftel 2013-06-19 13:31:53

avec CPython, pour des raisons d'efficacité hash() sur les objets internes renvoie la même valeur que id() qui à son tour renvoie le mémoire ("adresse") de l'objet.

D'un interpréteur de CPython à un autre emplacement de mémoire de cet objet est sujet à changement. Selon votre OS, cela pourrait changer d'une course à l'autre.

1
répondu Sylvain Leroux 2013-06-19 13:58:44

à partir de Python 3.3 l'algorithme de hachage par défaut a créé des valeurs de hachage qui sont salées avec une valeur aléatoire qui est différente même entre différents processus python sur la même machine.

la randomisation de hachage seulement est implémentée actuellement pour les chaînes de caractères-puisqu'elle a été considérée comme le type de données le plus probable capturé de l'extérieur qui pourrait être attaqué.

le même frozenset produit toujours la même valeur de hachage sur des machines différentes ou même différentes processus

Source: https://www.quora.com/Do-two-computers-produce-the-same-hash-for-identical-objects-in-Python

0
répondu nabiltos 2018-05-17 09:35:52