Y a-t-il un moyen de générer un identifiant de type HASH pour les objets de Python qui est uniquement basé sur les valeurs d'attribut des objets? Par exemple,
class test: def __init__(self, name): self.name = name obj1 = test('a') obj2 = test('a') hash1 = magicHash(obj1) hash2 = magicHash(obj2)
4 Réponses :
Vous voulez dire quelque chose comme ça?
Utilisation de la méthode spéciale __ hachage __ code>
class test: def __init__(self, name): self.name = name def __hash__(self): return hash(self.name) >>> hash(test(10)) == hash(test(20)) False >>> hash(test(10)) == hash(test(10)) True
@Bastien, tu as raison. Mais cela dépend vraiment de l'application. Pour de nombreux cas, le hachage pourrait suffire.
Il n'est pas recommandé de renvoyer quoi que ce soit de hachage __ (auto-) en dehors d'un int ( docs.pytthon.org/reeference/datamodel.html#Object .__ hachage b>) car cela rendra l'objet apparemment mais mal hachable (comme dans les dicts utilisés)
Si vous avez plus d'un attribut, un tuple fonctionne aussi, par exemple: hash ((self.first_name, self.last_name))
avoir un lool au HASH () Construire en fonction et le __ hachage __ () code> Méthode d'objet
. Ceux-ci peuvent être exactement ce que vous recherchez. Vous devrez mettre en œuvre __ hachage __ () code> pour vos propres cours. P>
pour obtenir une comparaison unique: strong> unique, vous pouvez sérialiser les données, puis comparer la valeur sérialisée pour vous assurer qu'elles correspond exactement. P> Exemple: p> note de la même valeur réduira toujours la même valeur au même hachage, mais 2 valeurs différentes pourraient réduire au même hachage. p> Vous ne pouvez pas utiliser quelque chose comme la fonction Hash intégrée () (sauf si vous remplacez ou quelque chose Aimez sérialiser les données à l'aide de cornichons, puis utilisez zlib.crc32. p> __ hachage __ code>) p>
Pour la comparaison unique, vous pouvez également utiliser Zlib.Compress pour rendre la représentation un peu plus petite si vos objets sont très grands.
Non, le cornichon n'est pas bon pour le hachage. Les résultats peuvent varier, comme décrit par Robert Brewer: aminus.org/blogs/index.php/2007/11/03/...
Je ne sais pas pourquoi mais avec CPPHON 2.5.1, je ne peux pas reproduire son comportement. Il hachait toujours le même résultat pour moi.
@Matt bon: Si vous continuez à lire les commentaires sur le poteau de blog, vous verrez que ce problème est avec CPICKLE NON PICKLE. Et est dû au comptage de référence.
Je suppose
def hash_attr(ins): return hash(tuple(ins.__dict__.items()))