code: def get_local_file_hash(
      cls, file_path: typing.Union[str, Path]
  ) -> str:
      local_storage = LocalFileHashStorage()
  
      absolute = Path(file_path).resolve()
      modification_date = datetime.datetime.fromtimestamp(
          absolute.stat().st_mtime
      ).strftime("%Y%m%d_%H%M%S%f")
  
      stored_file_hash = local_storage.fetch_one(absolute)
  
      if stored_file_hash:
          if stored_file_hash.modification_date >= modification_date:
              return stored_file_hash.file_hash
          else:
              computed_hash = sha1(absolute)
              local_storage.update(
                  absolute, computed_hash, modification_date
              )
  
              return computed_hash
      else:
          computed_hash = sha1(absolute)
          local_storage.insert(
              absolute, computed_hash, modification_date
          )
  
          return computed_hash
  
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 1 for calling the FileHasher obj's underlying member method code with example usage: obj.get_local_file_hash(cls, file_path) and returns: computed_hash, stored_file_hash, computed_hash