code: def file_md5(fname):
      
      from dvc.progress import progress
      from dvc.istextfile import istextfile
  
      if os.path.exists(fname):
          hash_md5 = hashlib.md5()
          binary = not istextfile(fname)
          size = os.path.getsize(fname)
          bar = False
          if size >= LARGE_FILE_SIZE:
              bar = True
              msg = "Computing md5 for a large file {}. This is only done once."
              logger.info(msg.format(os.path.relpath(fname)))
              name = os.path.relpath(fname)
              total = 0
  
          with open(fname, "rb") as fobj:
              while True:
                  data = fobj.read(LOCAL_CHUNK_SIZE)
                  if not data:
                      break
  
                  if bar:
                      total += len(data)
                      progress.update_target(name, total, size)
  
                  if binary:
                      chunk = data
                  else:
                      chunk = dos2unix(data)
  
                  hash_md5.update(chunk)
  
          if bar:
              progress.finish_target(name)
  
          return (hash_md5.hexdigest(), hash_md5.digest())
      else:
          return (None, None)
docs: get the (md5 hexdigest, md5 digest) of a file