code: def hash_auto(obj: AimObject) -> int:
      """Automatically detect and hash any AimObject-compatible object.
  
      The hash is an signed 64-bit integer.
      """
      if obj is None:
          return hash_none()
      elif isinstance(obj, bool):
          return hash_bool(obj)
      elif isinstance(obj, int):
          # We use same hash function for all the numbers
          return hash_number(obj)
      elif isinstance(obj, float):
          # We use same hash function for all the numbers
          return hash_number(obj)
      elif isinstance(obj, bytes):
          return hash_bytes(obj)
      elif isinstance(obj, str):
          return hash_string(obj)
      elif isinstance(obj, (tuple, list)):
          # Both `tuple` and `list` types are hashed through `hash_array`
          return hash_array(obj)
      elif isinstance(obj, dict):
          return hash_object(obj)
      else:
          raise NotImplementedError
  
file_path: aim/aim/storage/hashing/hashing.py
imports: import hashlib
  from aim.storage.encoding import encode_int64, decode_int64
  from aim.storage.hashing import c_hash
  from aim.storage.types import AimObject, AimObjectArray, AimObjectKey, AimObjectDict, NoneType
  from typing import Tuple, Union
label_desc: Use image node_id 10 for calling a global function with example usage: hash_auto(obj) and returns: hash_none, hash_bool, hash_number, hash_number, hash_bytes, hash_string, hash_array, hash_object