def cluster_options
      # We share clusters when a new client with different CRUD_OPTIONS
      # is requested; therefore, cluster should not be getting any of these
      # options upon instantiation
      options.reject do |key, value|
        CRUD_OPTIONS.include?(key.to_sym)
      end.merge(
        server_selection_semaphore: @server_selection_semaphore,
        # but need to put the database back in for auth...
        database: options[:database],

        # Put these options in for legacy compatibility, but note that
        # their values on the client and the cluster do not have to match -
        # applications should read these values from client, not from cluster
        max_read_retries: options[:max_read_retries],
        read_retry_interval: options[:read_retry_interval],
      )
    end
def cluster_options
      # We share clusters when a new client with different CRUD_OPTIONS
      # is requested; therefore, cluster should not be getting any of these
      # options upon instantiation
      options.reject do |key, value|
        CRUD_OPTIONS.include?(key.to_sym)
      end.merge(
        server_selection_semaphore: @server_selection_semaphore,
        # but need to put the database back in for auth...
        database: options[:database],

        # Put these options in for legacy compatibility, but note that
        # their values on the client and the cluster do not have to match -
        # applications should read these values from client, not from cluster
        max_read_retries: options[:max_read_retries],
        read_retry_interval: options[:read_retry_interval],
      )
    end
Get the hash value of the client.

 @example Get the client hash value.
   client.hash

 @return [ Integer ] The client hash value.

 @since 2.0.0
 Instantiate a new driver client.

 @example Instantiate a single server or mongos client.
   Mongo::Client.new(['127.0.0.1:27017'])

 @example Instantiate a client for a replica set.
   Mongo::Client.new(['127.0.0.1:27017', '127.0.0.1:27021'])

 @example Directly connect to a mongod in a replica set
   Mongo::Client.new(['127.0.0.1:27017'], :connect => :direct)
   # without `:connect => :direct`, Mongo::Client will discover and
   # connect to the replica set if given the address of a server in
   # a replica set

 @param [ Array<String> | String ] addresses_or_uri The array of server addresses in the
   form of host:port or a MongoDB URI connection string.
 @param [ Hash ] options The options to be used by the client.


 @option options [ String, Symbol ] :app_name Application name that is
   printed to the mongod logs upon establishing a connection in server
   versions >= 3.4.
 @option options [ Symbol ] :auth_mech The authentication mechanism to
   use. One of :mongodb_cr, :mongodb_x509, :plain, :scram, :scram256
 @option options [ Hash ] :auth_mech_properties
 @option options [ String ] :auth_source The source to authenticate from.
 @option options [ Array<String> ] :compressors A list of potential
   compressors to use, in order of preference. The driver chooses the
   first compressor that is also supported by the server. Currently the
   driver only supports 'zlib'.
 @option options [ Symbol ] :connect The connection method to use. This
   forces the cluster to behave in the specified way instead of
   auto-discovering. One of :direct, :replica_set, :sharded
 @option options [ Float ] :connect_timeout The timeout, in seconds, to
   attempt a connection.
 @option options [ String ] :database The database to connect to.
 @option options [ Float ] :heartbeat_frequency The number of seconds for
   the server monitor to refresh it's description via ismaster.
 @option options [ Object ] :id_generator A custom object to generate ids
   for documents. Must respond to #generate.
 @option options [ Integer ] :local_threshold The local threshold boundary
   in seconds for selecting a near server for an operation.
 @option options [ Logger ] :logger A custom logger if desired.
 @option options [ Integer ] :max_idle_time The maximum seconds a socket can remain idle
   since it has been checked in to the pool.
 @option options [ Integer ] :max_pool_size The maximum size of the
   connection pool.
 @option options [ Integer ] :max_read_retries The maximum number of read
   retries when legacy read retries are in use.
 @option options [ Integer ] :max_write_retries The maximum number of write
   retries when legacy write retries are in use.
 @option options [ Integer ] :min_pool_size The minimum size of the
   connection pool.
 @option options [ true, false ] :monitoring If false is given, the
   client is initialized without global SDAM event subscribers and
   will not publish SDAM events. Command monitoring and legacy events
   will still be published, and the driver will still perform SDAM and
   monitor its cluster in order to perform server selection. Built-in
   driver logging of SDAM events will be disabled because it is
   implemented through SDAM event subscription. Client#subscribe will
   succeed for all event types, but subscribers to SDAM events will
   not be invoked. Values other than false result in default behavior
   which is to perform normal SDAM event publication.
 @option options [ true, false ] :monitoring_io For internal driver
   use only. Set to false to prevent SDAM-related I/O from being
   done by this client or servers under it. Note: setting this option
   to false will make the client non-functional. It is intended for
   use in tests which manually invoke SDAM state transitions.
 @option options [ String ] :password The user's password.
 @option options [ String ] :platform Platform information to include in
   the metadata printed to the mongod logs upon establishing a connection
   in server versions >= 3.4.
 @option options [ Hash ] :read The read preference options. The hash
   may have the following items:
   - *:mode* -- read preference specified as a symbol; valid values are
     *:primary*, *:primary_preferred*, *:secondary*, *:secondary_preferred*
     and *:nearest*.
   - *:tag_sets* -- an array of hashes.
   - *:local_threshold*.
 @option options [ Hash ] :read_concern The read concern option.
 @option options [ Float ] :read_retry_interval The interval, in seconds,
   in which reads on a mongos are retried.
 @option options [ Symbol ] :replica_set The name of the replica set to
   connect to. Servers not in this replica set will be ignored.
 @option options [ true | false ] :retry_reads If true, modern retryable
   reads are enabled (which is the default). If false, modern retryable
   reads are disabled and legacy retryable reads are enabled.
 @option options [ true | false ] :retry_writes Retry writes once when
   connected to a replica set or sharded cluster versions 3.6 and up.
   (Default is true.)
 @option options [ true | false ] :scan Whether to scan all seeds
   in constructor. The default in driver version 2.x is to do so;
   driver version 3.x will not scan seeds in constructor. Opt in to the
   new behavior by setting this option to false. *Note:* setting
   this option to nil enables scanning seeds in constructor in driver
   version 2.x. Driver version 3.x will recognize this option but
   will ignore it and will never scan seeds in the constructor.
 @option options [ Proc ] :sdam_proc A Proc to invoke with the client
   as the argument prior to performing server discovery and monitoring.
   Use this to set up SDAM event listeners to receive events dispatched
   during client construction.

   Note: the client is not fully constructed when sdam_proc is invoked,
   in particular the cluster is nil at this time. sdam_proc should
   limit itself to calling #subscribe and #unsubscribe methods on the
   client only.
 @option options [ Integer ] :server_selection_timeout The timeout in seconds
   for selecting a server for an operation.
 @option options [ Float ] :socket_timeout The timeout, in seconds, to
   execute operations on a socket.
 @option options [ true, false ] :ssl Whether to use SSL.
 @option options [ String ] :ssl_ca_cert The file containing concatenated
   certificate authority certificates used to validate certs passed from the
   other end of the connection. One of :ssl_ca_cert, :ssl_ca_cert_string or
   :ssl_ca_cert_object (in order of priority) is required for :ssl_verify.
 @option options [ Array<OpenSSL::X509::Certificate> ] :ssl_ca_cert_object An array of
   OpenSSL::X509::Certificate representing the certificate authority certificates used
   to validate certs passed from the other end of the connection. One of :ssl_ca_cert,
   :ssl_ca_cert_string or :ssl_ca_cert_object (in order of priority) is required for :ssl_verify.
 @option options [ String ] :ssl_ca_cert_string A string containing concatenated
   certificate authority certificates used to validate certs passed from the
   other end of the connection. One of :ssl_ca_cert, :ssl_ca_cert_string or
   :ssl_ca_cert_object (in order of priority) is required for :ssl_verify.
 @option options [ String ] :ssl_cert The certificate file used to identify
   the connection against MongoDB. This option, if present, takes precedence
   over the values of :ssl_cert_string and :ssl_cert_object
 @option options [ OpenSSL::X509::Certificate ] :ssl_cert_object The OpenSSL::X509::Certificate
   used to identify the connection against MongoDB
 @option options [ String ] :ssl_cert_string A string containing the PEM-encoded
   certificate used to identify the connection against MongoDB. This option, if present,
   takes precedence over the value of :ssl_cert_object
 @option options [ String ] :ssl_key The private keyfile used to identify the
   connection against MongoDB. Note that even if the key is stored in the same
   file as the certificate, both need to be explicitly specified. This option,
   if present, takes precedence over the values of :ssl_key_string and :ssl_key_object
 @option options [ OpenSSL::PKey ] :ssl_key_object The private key used to identify the
   connection against MongoDB
 @option options [ String ] :ssl_key_pass_phrase A passphrase for the private key.
 @option options [ String ] :ssl_key_string A string containing the PEM-encoded private key
   used to identify the connection against MongoDB. This parameter, if present,
   takes precedence over the value of option :ssl_key_object
 @option options [ true, false ] :ssl_verify Whether to perform peer certificate validation and
   hostname verification. Note that the decision of whether to validate certificates will be
   overridden if :ssl_verify_certificate is set, and the decision of whether to validate
   hostnames will be overridden if :ssl_verify_hostname is set.
 @option options [ true, false ] :ssl_verify_certificate Whether to perform peer certificate
   validation. This setting overrides :ssl_verify with respect to whether certificate
   validation is performed.
 @option options [ true, false ] :ssl_verify_hostname Whether to perform peer hostname
   validation. This setting overrides :ssl_verify with respect to whether hostname validation
   is performed.
 @option options [ true, false ] :truncate_logs Whether to truncate the
   logs at the default 250 characters.
 @option options [ String ] :user The user name.
 @option options [ Float ] :wait_queue_timeout The time to wait, in
   seconds, in the connection pool for a connection to be checked in.
 @option options [ Hash ] :write The write concern options. Can be :w =>
   Integer|String, :fsync => Boolean, :j => Boolean.
 @option options [ Integer ] :zlib_compression_level The Zlib compression level to use, if using compression.
   See Ruby's Zlib module for valid levels.

 @since 2.0.0
 @api private