code: public Row resolve() throws DigestMismatchException
      {
          if (logger.isDebugEnabled())
              logger.debug("resolving {} responses", replies.size());
  
          long start = System.nanoTime();
  
          // validate digests against each other; throw immediately on mismatch.
          // also extract the data reply, if any.
          ColumnFamily data = null;
          ByteBuffer digest = null;
  
          for (MessageIn<ReadResponse> message : replies)
          {
              ReadResponse response = message.payload;
  
              ByteBuffer newDigest;
              if (response.isDigestQuery())
              {
                  newDigest = response.digest();
              }
              else
              {
                  // note that this allows for multiple data replies, post-CASSANDRA-5932
                  data = response.row().cf;
                  newDigest = ColumnFamily.digest(data);
              }
  
              if (digest == null)
                  digest = newDigest;
              else if (!digest.equals(newDigest))
                  throw new DigestMismatchException(key, digest, newDigest);
          }
  
          if (logger.isDebugEnabled())
              logger.debug("resolve: {} ms.", TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
          return new Row(key, data);
      }
docs: /*
  This method handles two different scenarios:
  
  a) we're handling the initial read, of data from the closest replica + digests
  from the rest.  In this case we check the digests against each other,
  throw an exception if there is a mismatch, otherwise return the data row.
  
  b) we're checking additional digests that arrived after the minimum to handle
  the requested ConsistencyLevel, i.e. asynchronous read repair check