code: def md5(self):
          
          if self._modified_m or not hasattr(self, '_hashed_md5'):
              if self.flags['C_CONTIGUOUS']:
                  hasher = hashlib.md5(self)
                  self._hashed_md5 = hasher.hexdigest()
              else:
                  # the case where we have sliced our nice
                  # contiguous array into a non- contiguous block
                  # for example (note slice *after* track operation):
                  # t = util.tracked_array(np.random.random(10))[::-1]
                  contiguous = np.ascontiguousarray(self)
                  hasher = hashlib.md5(contiguous)
                  self._hashed_md5 = hasher.hexdigest()
          self._modified_m = False
          return self._hashed_md5
docs: Return an MD5 hash of the current array.
  
          Returns
          -----------
          md5: str, hexadecimal MD5 of the array