commit d76ced9fbc1408472de5a08b15789bbb1bccc6c0 Author: Damian Johnson atagar@torproject.org Date: Fri Sep 5 08:52:37 2014 -0700
Proper hash function for ExitPolicy
We skipped on implementing hash() out of concern of a circular dependency from @lru_cache on _get_rules(). But _get_rules() no longer uses @lru_cache there due to pickleability so we can now implement hash(). --- stem/exit_policy.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/stem/exit_policy.py b/stem/exit_policy.py index 86722af..1f72b60 100644 --- a/stem/exit_policy.py +++ b/stem/exit_policy.py @@ -235,6 +235,7 @@ class ExitPolicy(object): self._input_rules = rules
self._rules = None + self._hash = None
# Result when no rules apply. According to the spec policies default to 'is # allowed', but our microdescriptor policy subclass might want to change @@ -435,12 +436,16 @@ class ExitPolicy(object): return ', '.join([str(rule) for rule in self._get_rules()])
def __hash__(self): - # TODO: It would be nice to provide a real hash function, but doing so is - # tricky due to how we lazily load the rules. Like equality checks a proper - # hash function would need to call _get_rules(), but that's behind - # @lru_cache which calls hash() forming a circular dependency. + if self._hash is None: + my_hash = 0 + + for rule in self._get_rules(): + my_hash *= 1024 + my_hash += hash(rule) + + self._hash = my_hash
- return id(self) + return self._hash
def __eq__(self, other): if isinstance(other, ExitPolicy):
tor-commits@lists.torproject.org