code: def _compare_equal(self, a, b, compare_values):
      a_key = a._generate_cache_key()
      b_key = b._generate_cache_key()
  
      if a_key is None:
          assert a._annotations.get("nocache")
  
          assert b_key is None
      else:
          eq_(a_key.key, b_key.key)
          eq_(hash(a_key.key), hash(b_key.key))
  
          for a_param, b_param in zip(
              a_key.bindparams, b_key.bindparams
          ):
              assert a_param.compare(
                  b_param, compare_values=compare_values
              )
      return a_key, b_key
  
imports: from __future__ import annotations
  import itertools
  import random
  import re
  import sys
  import sqlalchemy
  from .base import TestBase
  from ..None import config
  from ..None import mock
  from ..assertions import eq_
  from ..assertions import ne_
  from ..util import adict
  from ..util import drop_all_tables_from_metadata
  from ...None import event
  from ...None import util
  from ...schema import sort_tables_and_constraints
  from ...sql import visitors
  from ...sql.elements import ClauseElement
label_desc: Use image node_id 1 for calling the CacheKeyFixture obj's underlying member method code with example usage: obj._compare_equal(a, b, compare_values) and returns: a_key,  b_key