code: def get_artifact_hash_without_metadata(
      cls, artifact_files: typing.Iterable[ArtifactFileData]
  ) -> str:
      artifact_hash = hashlib.sha256()
  
      for artifact_file in sorted(
          artifact_files, key=lambda file: file.file_path
      ):
          artifact_hash.update(cls.HASH_ELEMENT_DIVISOR)
          artifact_hash.update(
              cls._number_to_bytes(
                  len(artifact_file.file_path), cls.SERVER_INT_BYTES
              )
          )
          artifact_hash.update(
              artifact_file.file_path.encode(cls.ENCODING)
          )
          artifact_hash.update(cls.HASH_ELEMENT_DIVISOR)
          artifact_hash.update(
              artifact_file.file_hash.encode(cls.ENCODING)
          )
          artifact_hash.update(cls.HASH_ELEMENT_DIVISOR)
          if artifact_file.size is not None:
              artifact_hash.update(
                  cls._number_to_bytes(
                      artifact_file.size, cls.SERVER_LONG_BYTES
                  )
              )
          artifact_hash.update(cls.HASH_ELEMENT_DIVISOR)
          artifact_hash.update(
              cls._number_to_bytes(
                  len(artifact_file.type), cls.SERVER_INT_BYTES
              )
          )
          artifact_hash.update(artifact_file.type.encode(cls.ENCODING))
  
      return str(artifact_hash.hexdigest())
  
file_path: neptune-client/src/neptune/internal/artifacts/file_hasher.py
imports: import datetime
  import hashlib
  import typing
  from pathlib import Path
  from neptune.internal.artifacts.local_file_hash_storage import LocalFileHashStorage
  from neptune.internal.artifacts.types import ArtifactFileData, ArtifactMetadataSerializer
  from neptune.internal.artifacts.utils import sha1
label_desc: Use image node_id 4 for calling the FileHasher obj's underlying member method code with example usage: obj.get_artifact_hash_without_metadata(cls, artifact_files) and returns: str