int32_t PdxInstanceImpl::hashcode()

in cppcache/src/PdxInstanceImpl.cpp [728:790]


int32_t PdxInstanceImpl::hashcode() const {
  const auto& stream = getPdxStream();
  auto input = cacheImpl_.createDataInput(stream.data(), stream.size());

  int hashCode = 1;
  for (const auto& field : getIdentityPdxFields()) {
    LOGDEBUG("hashcode for pdxfield %s  hashcode is %d ",
             field->getFieldName().c_str(), hashCode);
    switch (field->getTypeId()) {
      case PdxFieldTypes::CHAR:
      case PdxFieldTypes::BOOLEAN:
      case PdxFieldTypes::BYTE:
      case PdxFieldTypes::SHORT:
      case PdxFieldTypes::INT:
      case PdxFieldTypes::LONG:
      case PdxFieldTypes::DATE:
      case PdxFieldTypes::FLOAT:
      case PdxFieldTypes::DOUBLE:
      case PdxFieldTypes::STRING:
      case PdxFieldTypes::BOOLEAN_ARRAY:
      case PdxFieldTypes::CHAR_ARRAY:
      case PdxFieldTypes::BYTE_ARRAY:
      case PdxFieldTypes::SHORT_ARRAY:
      case PdxFieldTypes::INT_ARRAY:
      case PdxFieldTypes::LONG_ARRAY:
      case PdxFieldTypes::FLOAT_ARRAY:
      case PdxFieldTypes::DOUBLE_ARRAY:
      case PdxFieldTypes::STRING_ARRAY:
      case PdxFieldTypes::ARRAY_OF_BYTE_ARRAYS: {
        int retH = getRawHashCode(input, field);
        if (retH != 0) {
          hashCode = 31 * hashCode + retH;
        }
        break;
      }
      case PdxFieldTypes::OBJECT: {
        setOffsetForObject(input, field->getSequenceId());
        std::shared_ptr<Cacheable> object = nullptr;
        input.readObject(object);
        if (object != nullptr) {
          hashCode = 31 * hashCode + deepArrayHashCode(object);
        }
        break;
      }
      case PdxFieldTypes::OBJECT_ARRAY: {
        setOffsetForObject(input, field->getSequenceId());
        auto objectArray = CacheableObjectArray::create();
        objectArray->fromData(input);
        hashCode =
            31 * hashCode +
            ((objectArray != nullptr) ? deepArrayHashCode(objectArray) : 0);
        break;
      }
      case PdxFieldTypes::UNKNOWN: {
        throw IllegalStateException(
            "PdxInstance not found typeid " +
            std::to_string(static_cast<int>(field->getTypeId())));
      }
    }
  }

  return hashCode;
}