int PdxInstanceImpl::GetHashCode()

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