docs: def hash_function(self):
          """
          Returns the hash function proper. Ensures that `self` is not bound to
          the returned closure.
          """
          assert hasattr(self, 'f1') and hasattr(self, 'f2')
  
          # These are not just convenient aliases for the given
          # attributes; if `self` would creep into the returned closure,
          # that would ensure that a reference to this big, fat object
          # would be kept alive; hence, any hash function would carry
          # around all of the auxiliary state that was created during the
          # generation of the hash parameters.  Omitting `self` ensures
          # this object has a chance to be garbage collected.
          f1, f2, g = self.f1, self.f2, self.g
  
          def czech_hash(word):
              v1 = f1(word)
              v2 = f2(word)
              return g[v1] + g[v2]
  
          return czech_hash