|
@@ -30,13 +30,13 @@ class EmComponent(object):
|
30
|
30
|
return str(self.uid)
|
31
|
31
|
return str(self.display_name)
|
32
|
32
|
|
33
|
|
- def __hash__(self):
|
|
33
|
+ def d_hash(self):
|
34
|
34
|
m = hashlib.md5()
|
35
|
35
|
for data in (
|
36
|
36
|
self.uid,
|
37
|
|
- str(hash(self.display_name)),
|
38
|
|
- str(hash(self.help_text)),
|
39
|
|
- str(hash(self.group)),
|
|
37
|
+ 'NODISPNAME' if self.display_name is None else str(self.display_name.d_hash()),
|
|
38
|
+ 'NOHELP' if self.help_text is None else str(self.help_text.d_hash()),
|
|
39
|
+ 'NOGROUP' if self.group is None else str(self.group.d_hash()),
|
40
|
40
|
):
|
41
|
41
|
m.update(bytes(data, 'utf-8'))
|
42
|
42
|
return int.from_bytes(m.digest(), byteorder='big')
|
|
@@ -105,11 +105,11 @@ class EmClass(EmComponent):
|
105
|
105
|
def new_field(self, uid, **field_kwargs):
|
106
|
106
|
return self.add_field(EmField(uid, **field_kwargs))
|
107
|
107
|
|
108
|
|
- def __hash__(self):
|
|
108
|
+ def d_hash(self):
|
109
|
109
|
m = hashlib.md5()
|
110
|
|
- payload = str(super().__hash__()) + "1" if self.abstract else "0"
|
|
110
|
+ payload = str(super().d_hash()) + ("1" if self.abstract else "0")
|
111
|
111
|
for p in sorted(self.parents):
|
112
|
|
- payload += str(hash(p))
|
|
112
|
+ payload += str(p.d_hash())
|
113
|
113
|
m.update(bytes(payload, 'utf-8'))
|
114
|
114
|
return int.from_bytes(m.digest(), byteorder='big')
|
115
|
115
|
|
|
@@ -133,11 +133,11 @@ class EmField(EmComponent):
|
133
|
133
|
|
134
|
134
|
## @warning Not complete !
|
135
|
135
|
# @todo Complete the hash when data handlers becomes available
|
136
|
|
- def __hash__(self):
|
|
136
|
+ def d_hash(self):
|
137
|
137
|
return int.from_bytes(hashlib.md5(
|
138
|
138
|
bytes(
|
139
|
|
- "%s%s" % ( super().__hash__(),
|
140
|
|
- hash(self.data_handler)),
|
|
139
|
+ "%s%s" % ( super().d_hash(),
|
|
140
|
+ self.data_handler),
|
141
|
141
|
'utf-8')
|
142
|
142
|
).digest(), byteorder='big')
|
143
|
143
|
|
|
@@ -224,13 +224,13 @@ class EmGroup(object):
|
224
|
224
|
else:
|
225
|
225
|
return self.display_name.get()
|
226
|
226
|
|
227
|
|
- def __hash__(self):
|
|
227
|
+ def d_hash(self):
|
228
|
228
|
|
229
|
229
|
payload = "%s%s%s" % (self.uid, hash(self.display_name), hash(self.help_text))
|
230
|
230
|
for recurs in (False, True):
|
231
|
231
|
deps = self.dependencies(recurs)
|
232
|
232
|
for dep_uid in sorted(deps.keys()):
|
233
|
|
- payload += str(hash(deps[dep_uid]))
|
|
233
|
+ payload += str(deps[dep_uid].d_hash())
|
234
|
234
|
for req_by_uid in self.required_by:
|
235
|
235
|
payload += req_by_uid
|
236
|
236
|
return int.from_bytes(
|