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:
parent
fe14eb9d4b
commit
592cd16357
2 changed files with 20 additions and 0 deletions
|
@ -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:
|
||||
|
|
18
objets.py
18
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__()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue