parameters: (msg_context, spec, hash)
return_statement: return hash.hexdigest()
docstring: subroutine of compute_md5()
  
      :param msg_context: :class:`MsgContext` instance to load dependencies into/from.
      :param spec: :class:`MsgSpec` to compute hash for.
      :param hash: hash instance
docstring_summary: subroutine of compute_md5()
docstring_tokens: subroutine of compute_md5 ()
function: def _compute_hash(msg_context, spec, hash):
      """
      subroutine of compute_md5()
  
      :param msg_context: :class:`MsgContext` instance to load dependencies into/from.
      :param spec: :class:`MsgSpec` to compute hash for.
      :param hash: hash instance  
      """
      # accumulate the hash
      # - root file
      if isinstance(spec, MsgSpec):
          hash.update(compute_md5_text(msg_context, spec).encode())
      elif isinstance(spec, SrvSpec):
          hash.update(compute_md5_text(msg_context, spec.request).encode())
          hash.update(compute_md5_text(msg_context, spec.response).encode())
      else:
          raise Exception("[%s] is not a message or service"%spec)   
      return hash.hexdigest()
function_tokens: def _compute_hash ( msg_context , spec , hash ) : # accumulate the hash # - root file if isinstance ( spec , MsgSpec ) : hash . update ( compute_md5_text ( msg_context , spec ) . encode ( ) ) elif isinstance ( spec , SrvSpec ) : hash . update ( compute_md5_text ( msg_context , spec . request ) . encode ( ) ) hash . update ( compute_md5_text ( msg_context , spec . response ) . encode ( ) ) else : raise Exception ( "[%s] is not a message or service" % spec ) return hash . hexdigest ( )