...
Row hash can be calculated from affinity field values while marshalling to byte array. Because od field order is defined by scheme, hash can be calculated consistently regarding the column order.
Key can be compared as byte[] for compatible schemas (that has same key column set), otherwise oldest row should be upgrade first.
It is possible to compare keys column-by-column regarding the schema if same key can be serialized in more than one way. E.g. kind of compression will be supported and compressed rows could be marked with a flag.
Unlike Ignite 2.x approach, where binary object schema ID is defined by a set of fields that are present in a binary object, for the schema-first approach we assign a monotonically growing identifier to each version of the cache schema. The ordering guarantees should be provided by the underlying metadata storage layer (for example, the current distributed metastorage implementation or consensus-based metadata storage). The schema identifier should be stored together with the data rows (but not necessarily with each row individually: we can store schema ID along with a page or larger chunks of data). The history of schema versions must be stored for a long enough period of time to allow upgrade all existing data stored in a given cache.
...