/** <inheritdoc /> */
        int IBinaryEqualityComparer.GetHashCode(IBinaryStream stream, int startPos, int length,
                                                BinaryObjectSchemaHolder schema, int schemaId, Marshaller marshaller, IBinaryTypeDescriptor desc)
        {
            Debug.Assert(stream != null);
            Debug.Assert(startPos >= 0);
            Debug.Assert(length >= 0);
            Debug.Assert(schema != null);
            Debug.Assert(marshaller != null);
            Debug.Assert(desc != null);

            Validate();

            stream.Flush();

            // Preserve stream position.
            var pos = stream.Position;

            var reader = marshaller.StartUnmarshal(stream, BinaryMode.ForceBinary);
            var fields = schema.GetFullSchema(schemaId);

            int hash = 0;

            foreach (var fieldName in FieldNames)
            {
                int fieldId   = BinaryUtils.FieldId(desc.TypeId, fieldName, desc.NameMapper, desc.IdMapper);
                int fieldHash = 0;  // Null (missing) field hash code is 0.
                int fieldPos;

                if (fields.TryGetValue(fieldId, out fieldPos))
                {
                    stream.Seek(startPos + fieldPos - BinaryObjectHeader.Size, SeekOrigin.Begin);
                    var fieldVal = reader.Deserialize <object>();
                    fieldHash = fieldVal != null?fieldVal.GetHashCode() : 0;
                }

                hash = 31 * hash + fieldHash;
            }

            // Restore stream position.
            stream.Seek(pos, SeekOrigin.Begin);

            return(hash);
        }