Calculate fingerprint for an object
It looks alright to me, although it seems odd having a young man of age 20 to equal an "elderly" man of age 30 :-).

I have 3 minor things:

1) One MemoryStream can be used to serialize all expressions:

  public Func&lt;T, byte[]&gt; Build(Func&lt;byte[], byte[]&gt; computeHash)
  {
    return obj =&gt;
    {
      var binaryFormatter = new BinaryFormatter();
      using (var memory = new MemoryStream())
      {
        foreach (var t in _fingerprints.OrderBy(e =&gt; e.MemberName, StringComparer.OrdinalIgnoreCase))
        {
          var fingerprint = t.Fingerprint(obj);
          {
            binaryFormatter.Serialize(memory, fingerprint);
          }
        }

        return computeHash(memory.ToArray());
      }
    };
  }




2) The ToHexString() can be simplified like this:

  public static string ToHexString(this byte[] source)
  {
    if (source == null) throw new ArgumentNullException(nameof(source));

    return string.Join("", source.Select(ch =&gt; ch.ToString("X2")));
  }




3) FingerprintBuilder.Empty is an strange name. I would call it Builder or avoid the static instantiater.