code: def hashable(a=None) -> int:
      """
      Hashes many kinds of objects, including some that are unhashable through the builtin `hash` function.
      Lists and tuples are hashed based on their elements.
      """
      if isinstance(a, dict):
          # first hash the keys and values with hashable
          # then hash the tuple of int-tuples with the builtin
          return hash(
              tuple((hashable(k), hashable(v)) for k, v in a.items())
          )
      if isinstance(a, (tuple, list)):
          # lists are mutable and not hashable by default
          # for memoization, we need the hash to depend on the items
          return hash(tuple(hashable(i) for i in a))
      try:
          return hash(a)
      except TypeError:
          pass
      # Not hashable >>>
      try:
          return hash(cloudpickle.dumps(a))
      except Exception:
          if hasattr(a, "__dict__"):
              return hashable(a.__dict__)
          else:
              return id(a)
  
imports: import functools
  import warnings
  from typing import Any, Dict, List, NewType, Optional, Sequence, Tuple, Union, cast
  import arviz
  import cloudpickle
  import numpy
  import xarray
  from cachetools import LRUCache, cachedmethod
  from pytensor import Variable
  from pytensor.compile import SharedVariable
  from pytensor.graph.utils import ValidatingScratchpad
  from pymc.exceptions import BlockModelAccessError
label_desc: Use image node_id 12 for calling a global function with example usage: hashable(a) and returns: hash, hash, hash, hash, hashable, id