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;
}