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__()