fonction de hachage en Python 3.3 renvoie des résultats différents entre les sessions
J'ai mis en place un BloomFilter en python 3.3, et a obtenu des résultats différents à chaque session. Forage vers le bas, ce comportement bizarre j'ai le hachage interne() la fonction il retourne différentes valeurs de hachage pour la même chaîne à chaque session.
Exemple:
>>> hash("235")
-310569535015251310
----- ouverture d'une nouvelle console python -----
>>> hash("235")
-1900164331622581997
Pourquoi est-ce arrivé?
Pourquoi est-ce utile?
Vous devez vous connecter pour publier un commentaire.
Python utilise un hasard de hachage de semences pour empêcher les attaquants de tar-piqûres votre demande en vous envoyant des touches conçu pour entrer en collision. Voir la origine de la vulnérabilité de divulgation. Par la compensation de la valeur de hachage avec une valeur aléatoire (une seule fois au démarrage) attaquants ne peut plus prédire ce que les touches de collision.
Vous pouvez définir un fixe de semences ou de désactiver la fonction de réglage de la
PYTHONHASHSEED
variable d'environnement; la valeur par défaut estrandom
mais vous pouvez le régler à une valeur entière positive, avec0
la désactivation de la fonction en même temps.Les versions de Python 2.7 et 3.2 ont la fonctionnalité désactivée par défaut (utiliser le
-R
commutateur ou un ensemblePYTHONHASHSEED=random
pour l'activer); il est activé par défaut de Python 3.3, et jusqu'.Si vous avez été en s'appuyant sur la commande de clés dans un dictionnaire Python ou d'un ensemble, alors ne le faites pas. Python utilise une table de hachage pour mettre en œuvre ces types et leur ordre dépend de l'insertion et de la suppression de l'histoire ainsi que l'aléatoire de hachage de la graine.
Également voir le
objet.__hash__()
de la méthode spéciale de la documentation:Si vous avez besoin d'un stable de hachage de la mise en œuvre, vous avez probablement envie de regarder le
hashlib
module; ce qui implémente les fonctions de hachage cryptographiques. Le pybloom projet utilise cette approche.Depuis le décalage se compose d'un préfixe et d'un suffixe (valeur de départ et final XORed valeur, respectivement), vous ne pouvez pas stocker le décalage, malheureusement. Sur le côté positif, cela signifie que les attaquants ne peuvent pas facilement déterminer le décalage avec le calendrier attaques soit.
disable
lorsque la valeur 0? Je ne vois pas l'efficacité de la différence de paramètre à une ancienne écurie nombre de graines, sauf si je suis en manque de quelque chose. Ce que je veux dire, c'est quand j'utilisePYTHONHASHSEED=12345
- je obtenir la même valeur de hachage pour l'égalité des chaînes de caractères, même à travers des sessions - la même chose se passe lorsque j'utilisePYTHONHASHSEED=0
- le hachage pour l'égalité des chaînes de caractères seront les mêmes à travers des sessions (quoique différentes, 12345, mais c'est évident, c'est comment les graines de travail).0
il n'y a pas de postérité à tous et les tables de hachage pour les objets sont égaux à ceux générés dans une ancienne version de Python sans hashseed de soutien.PYTHONHASHSEED=0
devraient produire les mêmes valeurs de hachage comme un Python 2.6 pour la même chaîne d'entrée. L'option n'existe que parce que les systèmes de production devaient être en mesure de faire la transition à partir des versions sans randomisation à un avec, mais gardez compatible lors de la transition.De hachage de la randomisation est activée par défaut dans Python 3. C'est une fonctionnalité de sécurité:
Dans les versions précédentes de 2.6.8, vous pouvez passer sur la ligne de commande avec l'option-R, ou la PYTHONHASHSEED option d'environnement.
Vous pouvez l'éteindre par la mise en
PYTHONHASHSEED
à zéro.hash() est un Python fonction intégrée et de les utiliser pour calculer une valeur de hachage pour objet, pas de chaîne ou num.
Vous pouvez voir le détail dans cette page: https://docs.python.org/3.3/library/functions.html#hash.
et hash() les valeurs vient de l'objet __hash__ méthode.
Le doc a dit ce qui suit:
C'est pourquoi vous avez différentes valeur de hachage pour la même chaîne de caractères dans la console à l'autre.
Ce que vous mettre en œuvre n'est pas un bon moyen.
Lorsque vous souhaitez calculer une chaîne de valeur de hachage, il suffit d'utiliser hashlib
hash() est de viser à obtenir un objet de valeur de hachage, pas un stirng.
hash()
est parfaitement valable pour les chaînes ou des valeurs numériques. Vous confondez ce avec la__hash__
méthode personnalisée, utilisé parhash()
pour fournir une implémentation personnalisée de la valeur de hachage.