Fonction de hash pour les cransLdapObject. Seulement en ro. En rw on lève une exception.

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.
This commit is contained in:
Valentin Samir 2014-02-21 18:00:19 +01:00
parent fe14eb9d4b
commit 592cd16357
2 changed files with 20 additions and 0 deletions

View file

@ -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:

View file

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