in clicache/src/impl/PdxInstanceImpl.cpp [561:652]
int PdxInstanceImpl::GetHashCode()
{
int hashCode = 1;
PdxType^ pt = getPdxType();
IList<PdxFieldType^>^ pdxIdentityFieldList = getIdentityPdxFields(pt);
DataInput^ dataInput = gcnew DataInput(m_buffer, m_bufferLength, m_cache);
dataInput->setPdxdeserialization(true);
for (int i = 0; i < pdxIdentityFieldList->Count; i++)
{
PdxFieldType^ pField = pdxIdentityFieldList[i];
//Log::Debug("hashcode for pdxfield " + pField->FieldName + " hashcode is " + hashCode);
switch (pField->TypeId)
{
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(pt, pField, dataInput);
if (retH != 0)
hashCode = 31 * hashCode + retH;
break;
}
case PdxFieldTypes::OBJECT:
{
setOffsetForObject(dataInput, pt, pField->SequenceId);
Object^ object = dataInput->ReadObject();
if (object != nullptr)
{
if (object->GetType()->IsArray)
{
if (object->GetType()->GetElementType()->IsPrimitive)//primitive type
{
int retH = getRawHashCode(pt, pField, dataInput);
if (retH != 0)
hashCode = 31 * hashCode + retH;
}
else//array of objects
{
hashCode = 31 * hashCode + deepArrayHashCode(object);
}
}
else//object but can be hashtable, list etc
{
hashCode = 31 * hashCode + deepArrayHashCode(object);
}
}
else
{
//hashCode = 31 * hashCode; // this may be issue
}
break;
}
case PdxFieldTypes::OBJECT_ARRAY:
{
setOffsetForObject(dataInput, pt, pField->SequenceId);
Object^ objectArray = dataInput->ReadObjectArray();
hashCode = 31 * hashCode + (objectArray != nullptr) ? deepArrayHashCode(objectArray) : 0;
break;
}
default:
{
throw gcnew IllegalStateException("PdxInstance not found typeid " + pField->TypeId);
}
}
}
return hashCode;
}