anchor.diff:      % reduce P1E for the two parts here (hash and trivial phases)
       P1E_sub = calc_n_subparts_p1e(2, P1E),
       MaxKeySize = 128, % see compress_key/2
  +    % note: there are up to 2 affected items for a hash collision
  +    %       -> use (P1E_sub / 2)
       SigSize = calc_signature_size_nm_pair(
  -                ItemCount, OtherItemCount, ExpDelta, P1E_sub, MaxKeySize),
  +                ItemCount, OtherItemCount, ExpDelta, P1E_sub / 2, MaxKeySize),
   %%     log:pal("shash [ ~p ] - P1E: ~p, \tSigSize: ~B, \tMyIC: ~B, \tOtIC: ~B",
   %%             [self(), P1E, SigSize, ItemCount, OtherItemCount]),
       {SigSize, 0}.
  
positive.code:     % -> use fastest as they are quite close
      NT = calc_max_different_hashes(ItemCount, OtherItemCount, ExpDelta),
      % exact:
  %%     1 - util:for_to_fold(1, NT - 1,
  %%                          fun(I) -> (1 - I / BK2) end,
  %%                          fun erlang:'*'/2, 1).
      % approx:
      1 - math:exp(-(NT * (NT - 1) / 2) / BK2).
  
  %% @doc Creates a compressed key-value list comparing every item in Items
  %%      (at most ItemCount) with OtherItemCount other items and expecting at
  
negative.code: %%      probability of P1E, given we compare N hashes with M other hashes
  %%      pairwise with each other (assuming that ExpDelta percent of them are
  %%      different).
  %%      NOTE: if multiple items are affected by the collision, simply divide
  %%            P1E by the number of affected items!
  -spec calc_signature_size_nm_pair(N::non_neg_integer(), M::non_neg_integer(),
                                    ExpDelta::number(), P1E::float(),
                                    MaxSize::signature_size())
  