code: def deep_container_fingerprint(
      obj: Union[List[Any], Dict[Any, Any], Any],
      encoding: Text = DEFAULT_ENCODING,
  ) -> Text:
      """Calculate a hash which is stable.
  
      Works for lists and dictionaries. For keys and values, we recursively call
      `hash(...)` on them. In case of a dict, the hash is independent of the containers
      key order. Keep in mind that a list with items in a different order
      will not create the same hash!
  
      Args:
          obj: dictionary or list to be hashed.
          encoding: encoding used for dumping objects as strings
  
      Returns:
          hash of the container.
      """
      if isinstance(obj, dict):
          return get_dictionary_fingerprint(obj, encoding)
      elif isinstance(obj, list):
          return get_list_fingerprint(obj, encoding)
      elif hasattr(obj, "fingerprint") and callable(obj.fingerprint):
          return obj.fingerprint()
      else:
          return get_text_hash(str(obj), encoding)
  
imports: from collections import OrderedDict
  import errno
  import glob
  from hashlib import md5
  from io import StringIO
  import json
  import os
  import sys
  from pathlib import Path
  import re
  from typing import Any, Dict, List, Optional, Text, Type, Union
  import warnings
  import random
  import string
  import portalocker
  from ruamel import yaml
  from ruamel.yaml import RoundTripRepresenter, YAMLError
  from ruamel.yaml.constructor import DuplicateKeyError, BaseConstructor, ScalarNode
  from rasa.shared.constants import DEFAULT_LOG_LEVEL, ENV_LOG_LEVEL, NEXT_MAJOR_VERSION_FOR_DEPRECATIONS, CONFIG_SCHEMA_FILE, MODEL_CONFIG_SCHEMA_FILE
  from rasa.shared.exceptions import FileIOException, FileNotFoundException, YamlSyntaxException, RasaException
  import rasa.shared.utils.validation
label_desc: Use image node_id 10 for calling a global function with example usage: deep_container_fingerprint(obj, encoding) and returns: get_dictionary_fingerprint, get_list_fingerprint, obj, get_text_hash