code: def hash_datasets(datasets: dict) -> dict:
      """Describe `datasets` with dicts of hashes for their values, column names, and column values
  
      Parameters
      ----------
      datasets: Dict
          Mapping of dataset names to `pandas.DataFrame` instances
  
      Returns
      -------
      hashes: Dict
          Mapping with same keys as `datasets`, whose values are dicts returned from
          :func:`_hash_dataset` that provide hashes for each DataFrame and its column names/values
  
      Examples
      --------
      >>> df_x = pd.DataFrame(dict(a=[0, 1], b=[2, 3], c=[4, 5]))
      >>> df_y = pd.DataFrame(dict(a=[0, 1], b=[6, 7], d=[8, 9]))
      >>> hash_datasets(dict(x=df_x, y=df_y)) == dict(x=_hash_dataset(df_x), y=_hash_dataset(df_y))
      True"""
      hashes = {k: _hash_dataset(v) for k, v in datasets.items()}
      return hashes
  
imports: from hyperparameter_hunter.keys.hashing import make_hash_sha256
  from hyperparameter_hunter.space.dimensions import Categorical, RejectedOptional
  from hyperparameter_hunter.utils.boltons_utils import remap, default_visit, default_enter
  from hyperparameter_hunter.utils.general_utils import subdict
  import ast
  from contextlib import suppress
  from inspect import getsource
  import numpy
  import pandas
  from typing import List, Callable, Dict, Union, Tuple
label_desc: Use image node_id 8 for calling a global function with example usage: hash_datasets(datasets) and returns: hashes