/** <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); }