From 592cd163577ee32cca6d6e0243754a4c5f704d2f Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Fri, 21 Feb 2014 18:00:19 +0100 Subject: [PATCH] =?UTF-8?q?Fonction=20de=20hash=20pour=20les=20cransLdapOb?= =?UTF-8?q?ject.=20Seulement=20en=20ro.=20En=20rw=20on=20l=C3=A8ve=20une?= =?UTF-8?q?=20exception.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit En effet, python n'aime pas que les objets multables soient utilisé dans des sets ou comme clef de dictionnaire, du coup, on va essayer de ne pas le contrarier. De toute façon, c'est logique vu que la valeur du hash change si on édite l'objet. --- attributs.py | 2 ++ objets.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/attributs.py b/attributs.py index aebe1dd..4239d0d 100644 --- a/attributs.py +++ b/attributs.py @@ -272,6 +272,8 @@ class Attr(object): self.parse_value(val) def __hash__(self): + if not self.parent or self.parent.mode in ['w', 'rw']: + raise TypeError("Mutable structure are not hashable, please use mode = 'ro' to do so") if hasattr(self.value, "__hash__") and self.value.__hash__ is not None: return self.value.__hash__() else: diff --git a/objets.py b/objets.py index 7ebc0d5..7954a10 100644 --- a/objets.py +++ b/objets.py @@ -174,6 +174,24 @@ class CransLdapObject(object): else: return False + def __hash__(self): + if self.mode in ['w', 'rw']: + raise TypeError("Mutable structure are not hashable, please use mode = 'ro' to do so") + def c_mul(a, b): + return eval(hex((long(a) * b) & 0xFFFFFFFFL)[:-1]) + value = 0x345678 + l=0 + keys = self.keys() + keys.sort() + for key in keys: + l+=len(self.attrs[key]) + for item in self.attrs[key]: + value = c_mul(1000003, value) ^ hash(item) + value = value ^ l + if value == -1: + value = -2 + return value + def __iter__(self): if self.mode in [ 'w', 'rw' ]: return self._modifs.__iter__()